JavaScript 中严格模式下作用域有什么变化
在 javascript 的严格模式("use strict")下,作用域最核心的变化是禁止了隐式全局变量的创建,并且对函数参数和变量声明的限制更加严格。具体来说,如果在非函数作用域或函数内部未使用 var、let 或 const 直接赋值,引擎会抛出 referenceerror 而非静默创建全局属性;同时,函数的 this 在非绑定调用时不再自动指向全局对象,而是保持为 undefined。

未声明变量赋值的行为差异
在非严格模式下,给一个从未声明的标识符赋值会自动在全局对象上创建一个同名属性,这往往导致难以排查的命名冲突。而在严格模式下,这种行为被彻底禁止,任何尝试向未声明变量赋值的操作都会立即触发运行时错误,迫使开发者显式地管理变量作用域。

function testScope() {
// 严格模式下,直接赋值会报错
window.strictModeVar = "I am global";
}
try {
testScope();
} catch (e) {
console.log(e.name); // 输出: ReferenceError
}
函数 this 绑定的行为差异
当函数作为普通函数调用(即没有通过对象方法调用或 call/apply/bind 绑定)时,非严格模式下的 this 会默认指向全局对象(浏览器中的 window)。但在严格模式中,此时的 this 值为 undefined,这有助于防止意外修改全局属性,并让开发者更清晰地意识到上下文丢失的问题。

function checkThis() {
console.log(this === undefined);
}
checkThis(); // 严格模式下输出: true
// 非严格模式下输出: false (this 指向 window)
基于程序中某个输入、条件或结果的具体问题
在上述代码示例中,如果我们传入一个具体的执行环境(如 Node.js 或现代浏览器),并观察 testScope 函数的运行结果,会发现程序在尝试访问 window.strictModeVar 之前就已经因为 ReferenceError 而中断。这是因为在严格模式块内,window 本身可能不存在(如在 ES Modules 中),或者即使存在,直接赋值给未声明的全局标识符也是非法的。这种机制确保了代码的可维护性,避免了“幽灵变量”的产生。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











