题目 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 会改变调用后的输出。

这道题考察什么

  • 参数绑定
  • 局部变量遮蔽
  • 沿作用域链写入

运行环境前提

传入的是基本类型数字,不涉及共享对象的属性修改。

规范参考

JavaScript 代码编辑器支持直接编辑或粘贴自定义代码
第 0 步 / 共 0 步
单步Space播放
按 → 单步 或 Space 自动播放
阶段 1: 编译预解析(变量提升与内存分配)
阶段 2: 代码执行(逐行赋值与调用求值)
单步执行原理解析

按键盘右方向键 “→” 进行单步调试,或按空格键 “Space” / 点击 “▶ 自动播放” 进行连续执行。

作用域链 (Scope Chain)
词法作用域链: 当前 AO → 外部 [[Scope]] → 全局 (GO)
暂无激活的作用域链
调用栈 (CALL STACK)执行上下文栈 (后进先出 LIFO)
后进先出 (LIFO) 栈帧
全局执行上下文 (GEC)
▶ 活动栈帧
堆内存空间 (HEAP & MEMORY SPACE)已分配对象 (GO, AO, FunctionObjects, ER)
ECMAScript 堆内存区
内存中暂无分配对象
控制台输出 (Console)
console.log(...) Stream
暂无输出产生