Appearance
作用域与闭包
来源:
js/基础/5作用域.html,对 JS 词法作用域、闭包、变量提升、块级作用域进行实例化验证。
速查导航
- 词法作用域 — 函数在定义时的作用域中查找变量,而非调用时
- 闭包 — 内部函数保持对外层作用域变量的引用
- 闭包 vs 非闭包 — 返回函数 vs 返回函数调用结果
- 闭包与引用类型 — 参数传引用时的闭包行为
- 变量提升 — var 声明提升与函数声明优先
- 块级作用域与函数声明 — if 块中的 function 声明行为
- 执行上下文 — 调用栈与执行顺序
词法作用域
函数在定义时的作用域中查找变量,而非在调用时的作用域中。
js
js
js
js
闭包
内部函数保持对外层函数局部变量的引用,即使外层函数已返回。
js
闭包三要素:
- 外层函数返回内部函数(而非调用结果)
- 内部函数引用外层局部变量
- 外层函数的局部变量在多次调用间保持状态
闭包 vs 非闭包
返回函数调用结果 vs 返回函数本身,行为完全不同。
js
js
闭包与引用类型
参数传递引用类型时,函数内修改元素影响原数组,但重新赋值参数不影响。
js
关键区分:
a[100] = 3:通过引用修改对象属性 → 外部可见a = [1, 2, 3]:重新绑定局部参数 → 仅影响函数内部
变量提升
var 声明会提升到函数/全局作用域顶部(值为 undefined),函数声明提升优先于 var。
js
js
js
js
块级作用域与函数声明
ES6 中 if 块内的 function 声明行为类似 var:提升到块级作用域顶部。
js
解析过程:
var a = 0声明全局变量aif块内function a(){}提升到块顶部(类似var a),同时覆盖外部var aa = 1→a = 21都是对同一个a赋值- 块外
a已被修改为 21
js
执行上下文
函数调用形成调用栈,每次调用创建独立的执行上下文。
js
js
js