在 javascript 中,给未声明的变量赋值会隐式创建一个全局变量(非严格模式下)或抛出 referenceerror(严格模式下)。具体行为取决于代码是否处于严格模式。在非严格模式下,赋值操作会自动在全局对象上创建该属性;而在严格模式下,引擎会阻止这种隐式创建并报错。

非严格模式下隐式全局变量的创建机制
在非严格模式的普通脚本或函数中,直接对未声明的标识符进行赋值,JavaScript 引擎会沿着作用域链向上查找,直到找到全局对象(如浏览器中的 window 或 Node.js 中的 global),并在其上创建该属性。这意味着该变量成为了全局变量,且其属性描述符中的 writable、enumerable 和 configurable 通常都为 true。

var x = 10;
console.log(x); // 10
console.log(window.x); // 10 (在浏览器环境中)
console.log(Object.getOwnPropertyDescriptor(window, 'x')); // {value: 10, writable: true, enumerable: true, configurable: true}
严格模式下 ReferenceError 的触发条件
当代码包含 'use strict'; 指令时,JavaScript 进入严格模式。此时,尝试给未声明的变量赋值会立即抛出 ReferenceError,因为严格模式禁止了隐式全局变量的创建,要求所有变量必须显式声明。这有助于捕获拼写错误和防止意外污染全局命名空间。

'use strict'; y = 20; // 抛出 ReferenceError: y is not defined
基于赋值操作对全局对象属性的实际影响
在非严格模式下,通过未声明变量赋值创建的全局属性,可以通过 delete 运算符删除,也可以通过 in 操作符检测存在性。这与使用 var 声明的全局变量不同,后者创建的属性默认是不可配置的(configurable: false),无法被 delete 删除。这一差异在实际开发中可能导致内存泄漏或意外的属性残留。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











