题目 07 / 31

未声明的赋值何时会创建全局变量?

知识点: 全局绑定难度: 进阶

非严格脚本对无法解析名称的赋值可能在全局对象上创建属性。

使用执行可视化器解题在下方逐步观察每个绑定、函数调用和控制台输出。

预测输出结果

没有 var、let 或 const 声明,为什么仍然可以输出 b?

console.log(a)

b = 10
console.log(b)

var a = 20
console.log(a)
查看答案与完整解析

正确输出

undefined
10
20

为什么会这样

全局 var a 在执行前已经准备好,所以第一次输出 undefined。

在非严格脚本中,给无法解析的名称 b 赋值,会创建值为 10 的全局对象属性。

后面的 var 初始化器把 20 写入 a,因此最后输出 20。

这道题考察什么

  • 非严格模式赋值
  • 全局对象属性
  • 已声明与未声明名称

运行环境前提

本题要求非严格经典脚本语义。严格模式和 ES Module 执行 b = 10 时会抛出 ReferenceError。

规范参考

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

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