严格模式是让javaScript报错更早、行为更确定的执行开关,必须作为脚本或函数作用域内首个可执行语句以纯字符串字面量形式书写,能拦截拼错变量名、this绑定异常、误删系统属性等静默错误。

严格模式不是新语法,而是让 javascript 报错更早、行为更确定的“执行开关”——现在绝大多数现代项目已默认启用,但手动加 "use strict" 仍是你排查老代码、IIFE 或非模块化脚本时最有效的兜底手段。
怎么写才真正生效
它必须是脚本或函数作用域内第一个可执行语句,连空行和注释都得让路:
-
"use strict"必须是纯字符串字面量(双引号或单引号均可),不能带分号干扰(虽然加了也不报错,但语义不规范) - 全局启用:放在
.js文件第一行,前面不能有console.log()、var x = 1或任何表达式 - 函数级启用:
function foo() { "use strict"; ... }—— 必须是函数体内的第一行,箭头函数无法使用(无函数体) - 块级作用域里写
{ "use strict"; }是无效的,引擎直接忽略
它拦住哪些你以为“能跑通”的坑
很多低级错误在非严格模式下静默发生,直到上线才暴露:
- 拼错变量名:
usernmae = "jack"→ 非严格模式自动挂到window.usernmae;严格模式立刻抛ReferenceError: usernmae is not defined - this 绑定异常:
function foo() { console.log(this); }单独调用时,非严格模式输出window,严格模式输出undefined,帮你提前发现漏绑.bind()或该用箭头函数的地方 - 误删系统属性:
delete Object.prototype.toString在非严格模式返回false不报错;严格模式直接抛TypeError - 重复参数名:
function bar(a, a) { }在严格模式下是语法错误,而非只取第二个值
为什么现在还值得手动加
es6 模块(import/export)、class、.mjs 文件确实默认严格,但这些场景仍需你主动加:
- 普通
标签加载的脚本(尤其老项目或 cms 嵌入代码) - CommonJS 模块(node.js 的
require()加载的.js文件) - IIFE 包裹的代码(如
(function(){ ... })();),打包后可能被合并导致顶部"use strict"失效 - 调试时想快速验证某段逻辑是否受严格约束,局部加一句最直接
最容易被忽略的一点:严格模式是词法继承的——一个严格函数里的嵌套函数,即使没写 "use strict",也自动处于严格模式;但反过来,非严格函数里的子函数不会“感染”成严格。所以别靠猜测,该加就加。