题目 01 / 14
为什么函数中的局部变量输出 undefined?
知识点: 声明实例化
函数内的 var 声明会在赋值语句执行前创建局部绑定。
使用执行可视化器解题在下方逐步观察每个绑定、函数调用和控制台输出。预测输出结果
预测输出结果。函数读取的是外层的 a,还是尚未赋值的局部 a?
var a = 10;
function fn() {
console.log(a);
var a = 20;
}
fn();查看答案与完整解析
正确输出
undefined为什么会这样
声明实例化阶段会把 fn 内的 var a 提升到函数体执行之前,创建一个初始值为 undefined 的局部 a 绑定。
这个局部绑定在整个函数体中遮蔽外层的 a,因此 ResolveBinding 会先找到局部 a,不会再查找外层环境。
赋值语句 var a = 20 要到下一行才执行,这时输出语句已经运行完毕,所以即使外层存在值为 10 的 a,console.log(a) 依然输出 undefined。
这道题考察什么
- var 提升
- 局部变量遮蔽
- 函数作用域声明
运行环境前提
在现代 JavaScript 环境的经典脚本或模块中,结果一致。