题目 02 / 14
当形参与局部 var 变量同名时会发生什么?
知识点: 词法作用域
与已存在的形参同名的 var 声明不会创建新绑定,而是复用形参的绑定。
使用执行可视化器解题在下方逐步观察每个绑定、函数调用和控制台输出。预测输出结果
预测输出结果。fn 内的 var a 会创建第二个绑定,还是只是重新赋值形参 a?
var a = 10;
function fn(a) {
console.log(a);
var a = 20;
console.log(a);
}
fn(5);查看答案与完整解析
正确输出
5
20为什么会这样
当 fn(5) 执行时,形参 a 在函数体运行前就已经在函数的环境中绑定为 5。
声明实例化处理函数体内的 var a 时,由于 a 已经作为形参声明过,提升过程不会再创建第二个绑定,也不会把它重置为 undefined —— 复用的是形参的绑定,因此第一次 console.log(a) 输出 5。
接下来的 var a = 20 给这同一个绑定赋值为 20,所以第二次 console.log(a) 输出 20。
这道题考察什么
- 形参绑定
- var 与形参共用同一个绑定
- 不会重置为 undefined
运行环境前提
这一行为由函数的声明实例化规则决定,在任意标准 JavaScript 引擎的脚本或模块代码中都成立。