严格模式不新增作用域类型,但通过禁止with、隔离eval作用域、禁用arguments/eval作标识符、禁止重复参数名,强化作用域确定性与安全性。

JS 严格模式本身不新增作用域类型(如块级作用域),但它通过强化已有作用域规则、限制动态作用域操作,显著提升了作用域的确定性与安全性。它不改变 var/let/const 的作用域机制,而是约束那些容易导致作用域混乱的行为。
禁止使用 with 语句破坏词法作用域
with 会临时将对象属性注入当前作用域链,使变量查找变得模糊且不可预测,也阻碍引擎优化。严格模式直接禁止该语法:
-
"use strict"; with ({a: 1}) { console.log(a); }→ 报 SyntaxError - 非严格模式下虽可运行,但已属废弃特性;严格模式将其彻底移除,强制开发者显式访问对象属性(如
obj.a)
限制 eval 的作用域污染
非严格模式中,eval 内部声明的变量会泄漏到外层函数作用域,造成隐式绑定和调试困难。严格模式让 eval 拥有独立的、隔离的作用域:
-
"use strict"; var x = 10; eval("var x = 20;"); console.log(x);→ 输出 10(外层 x 不受影响) - 而相同代码在非严格模式下输出 20,因
eval修改了外层变量 - 这也意味着
eval内无法通过赋值覆盖外层同名变量或函数参数
禁止 arguments 和 eval 作为标识符,避免作用域遮蔽
严格模式把 arguments 和 eval 视为保留名,不允许用作变量名、函数名或参数名,防止意外遮蔽内置行为:
-
"use strict"; function foo(eval) { }→ 报 SyntaxError -
"use strict"; var arguments = [];→ 报 SyntaxError - 此举确保函数内
arguments始终指向实参类数组对象,不会被局部变量覆盖,保障作用域引用的一致性
强化函数参数作用域的确定性
严格模式禁止重复参数名,从语法层面杜绝因参数重名引发的作用域歧义:
-
"use strict"; function bar(a, a) { }→ 报 SyntaxError - 非严格模式下,后一个
a会覆盖前一个,但调用时行为不直观(如bar(1, 2)中a取值为 2) - 该限制让参数列表成为明确、无冲突的局部绑定声明,提升函数内部作用域的可读性与可维护性











