Skip to content

作用域与闭包

来源:js/基础/5作用域.html,对 JS 词法作用域、闭包、变量提升、块级作用域进行实例化验证。

速查导航


词法作用域

函数在定义时的作用域中查找变量,而非在调用时的作用域中。

js
js
js
js

闭包

内部函数保持对外层函数局部变量的引用,即使外层函数已返回。

js

闭包三要素:

  1. 外层函数返回内部函数(而非调用结果)
  2. 内部函数引用外层局部变量
  3. 外层函数的局部变量在多次调用间保持状态

闭包 vs 非闭包

返回函数调用结果 vs 返回函数本身,行为完全不同。

js
js

闭包与引用类型

参数传递引用类型时,函数内修改元素影响原数组,但重新赋值参数不影响。

js

关键区分:

  • a[100] = 3:通过引用修改对象属性 → 外部可见
  • a = [1, 2, 3]:重新绑定局部参数 → 仅影响函数内部

变量提升

var 声明会提升到函数/全局作用域顶部(值为 undefined),函数声明提升优先于 var

js
js
js
js

块级作用域与函数声明

ES6 中 if 块内的 function 声明行为类似 var:提升到块级作用域顶部。

js

解析过程:

  1. var a = 0 声明全局变量 a
  2. if 块内 function a(){} 提升到块顶部(类似 var a),同时覆盖外部 var a
  3. a = 1a = 21 都是对同一个 a 赋值
  4. 块外 a 已被修改为 21
js

执行上下文

函数调用形成调用栈,每次调用创建独立的执行上下文。

js
js
js