严格模式通过强制显式声明变量、禁止隐式全局、切断形参与arguments绑定、禁用with/eval等方式,使作用域边界更清晰、变量生命周期更可控。

严格模式是 JavaScript 中规范变量作用域最直接有效的机制之一。它不改变作用域本身的结构(如词法作用域、块级作用域),而是通过强制显式声明、拦截隐式行为,让作用域边界更清晰、变量生命周期更可控。
所有变量必须显式声明才可使用
非严格模式下,漏写 let、const 或 var 会导致变量自动挂到全局对象(如 window),形成意外的全局污染;严格模式下,这会立即抛出 ReferenceError:
-
"use strict"; x = 10;→ 报错:x is not defined -
for(i = 0; i < 5; i++) { ... }→ 报错:i is not defined - 正确写法:
for(let i = 0; i < 5; i++) { ... }(配合块级作用域,避免循环变量泄露)
函数参数与 arguments 不再隐式绑定
严格模式切断了形参与 arguments 对象的双向同步,让变量访问逻辑更确定:
- 非严格模式:
function f(a) { a = 2; return arguments[0]; }→ 返回2(arguments[0]随a改变) - 严格模式:
function f(a) { "use strict"; a = 2; return arguments[0]; }→ 返回原传入值(arguments[0]不再响应a修改) - 参数名重复也被禁止:
function g(a, a) { }→ 直接SyntaxError,避免运行时歧义
eval 和 with 被限制,保护作用域隔离性
这两项操作会动态干扰词法作用域链,严格模式对其做了硬性约束:
立即学习“Java免费学习笔记(深入)”;
-
eval("let x = 42")→x不会泄露到外层作用域(拥有独立词法环境) -
with(obj) { x = 1; }→ 直接SyntaxError,因作用域解析不可预测,影响调试和引擎优化 - 现代项目已基本弃用
with;eval在生产环境也应避免
局部启用严格模式需注意作用域继承规则
严格模式不是“传染性”的——子函数不会自动继承父函数的严格状态:
-
function outer() { "use strict"; function inner() { x = 1; } inner(); }→inner内部不报错(它自己未启用严格模式) - 若需全链严格,每个函数都应显式声明:
function inner() { "use strict"; ... } - ES6 模块(
.mjs或<script type="module">)默认启用,无需手动加


















