题目 08 / 14
哪些赋值修改参数、局部变量或全局变量?
知识点: 词法作用域
参数 a 和局部 b 遮蔽全局变量,而 c 会解析到外层绑定。
使用执行可视化器解题在下方逐步观察每个绑定、函数调用和控制台输出。预测输出结果
fn 返回后,三个全局值中究竟哪一个发生了改变?
var a = 12, b = 13, c = 14
function fn(a) {
a = 0
var b = 0
c = 0
}
fn(a)
console.log(a)
console.log(b)
console.log(c)查看答案与完整解析
正确输出
12
13
0为什么会这样
参数 a 是用实参数值 12 初始化的局部绑定。把它改为 0 不会修改全局 a。
var 声明创建局部 b,所以 b = 0 同样不会改变全局 b。
函数中没有局部 c。标识符查找会到达全局 c,因此 c = 0 会改变调用后的输出。
这道题考察什么
- 参数绑定
- 局部变量遮蔽
- 沿作用域链写入
运行环境前提
传入的是基本类型数字,不涉及共享对象的属性修改。