严格模式下未声明变量赋值、函数参数名重复、使用with语句会直接报错;eval无法污染外部作用域;独立调用函数时this为undefined。

严格模式下哪些赋值操作会直接报错?
启用严格模式后,"use strict" 会让原本静默失败的错误变成显式 TypeError 或 ReferenceError。比如给未声明变量赋值:
"use strict"; x = 10; // TypeError: Cannot assign to undeclared variable 'x'这类操作在非严格模式下会自动创建全局变量,而严格模式直接拒绝——这是防止污染全局作用域的第一道防线。
为什么函数参数名重复会触发语法错误?
严格模式在解析阶段就检查形参重复,而非等到运行时:
"use strict";
function foo(a, a) { } // SyntaxError: Duplicate parameter name not allowed in this context非严格模式允许这种写法(后一个覆盖前一个),但极易引发逻辑混淆。严格模式强制你在定义阶段就发现命名冲突,避免调试时陷入“为什么第二个参数值总覆盖第一个”的陷阱。
with 和 eval 在严格模式中有什么限制?
严格模式禁用 with 语句,并改变 eval 的作用域行为:
-
with直接报SyntaxError,因为它的动态作用域会干扰静态分析和优化 -
eval不再能向外部作用域注入变量或函数,它只能访问自身局部作用域和全局作用域
"use strict";
eval("var x = 42;");
console.log(x); // ReferenceError: x is not defined这对代码可预测性和引擎优化很关键,尤其在模块化或打包场景中,避免意外变量泄漏。
严格模式对 this 的绑定更严格吗?
是的。非严格模式下,函数独立调用时 this 指向全局对象(window 或 global);严格模式下则为 undefined:
"use strict";
function test() {
return this;
}
test(); // undefined这能及早暴露 this 绑定错误,尤其在事件回调、定时器或箭头函数误用场景中。不过注意:类方法、箭头函数、显式绑定(call/bind)不受此影响——它们本就不依赖严格模式来约束 this。
严格模式不是万能补丁,它不捕获逻辑错误,也不修复异步竞态或内存泄漏。但它把很多“你以为代码跑通了”的隐性坑,变成了立刻抛出的错误——前提是你要真开了它,且没被构建工具或模块系统意外剥离掉 "use strict" 指令。










