严格模式通过抛出referenceerror或typeerror强制暴露隐式全局变量和静默错误,要求显式声明变量、禁止对只读/不可配置属性赋值或删除,并需函数级启用或使用es模块。

严格模式能直接让隐式全局变量和静默错误“现形”——不是靠提示或警告,而是立刻抛出 ReferenceError 或 TypeError,迫使你面对问题根源。
隐式全局变量:未声明就赋值,直接报错
非严格模式下,x = 10 会悄悄挂到 window.x(浏览器)或 global.x(Node.js),污染全局作用域。严格模式下,这行代码运行即崩:
-
"use strict"; x = 10;→ ReferenceError: x is not defined - 必须显式声明:
let x = 10;、const x = 10;或var x = 10; - 拼写错误也会暴露:
userName = "Alice";写成useName = "Alice";,立刻报错,而不是默默创建一个无用的全局变量
静默失败操作:从“假装成功”变成明确异常
很多不合理操作在非严格模式中不声不响地失败,掩盖逻辑漏洞。严格模式强制它们显式报错:
- 给只读属性赋值:
Object.defineProperty(obj, 'id', { writable: false }); obj.id = 99;→ TypeError - 删除不可配置属性:
delete Math.PI;或delete obj.toString;→ TypeError - 向不可扩展对象添加新属性:
Object.preventExtensions(obj); obj.newKey = 1;→ TypeError - 对
NaN、undefined、eval等标识符重新赋值:NaN = 42;→ TypeError: Cannot assign to read only property
函数级启用才是真生效,文件顶部不够用
"use strict" 只作用于**当前作用域**。只在文件顶部写一句,无法覆盖所有函数:
- 普通函数声明(如
function foo() { ... })不在该作用域内,仍按非严格模式执行 - 动态函数(
new Function('x', 'return x + 1'))完全不受影响,需额外传入"use strict"字符串 - 推荐做法:每个函数体第一行都加
"use strict";或统一用 ES 模块(.mjs或import/export),它默认启用严格模式 - CommonJS(
.cjs)仍需手动添加,不能依赖文件顶部一句就高枕无忧
配合 delete 和 this 行为,进一步暴露设计缺陷
严格模式不只是堵漏,还帮你发现更深层的问题:
-
delete obj.prop对不可配置属性报错,提醒你是否误删了冻结对象或内置属性(比如delete window.location) - 独立函数调用时
this为undefined而非window,让setTimeout(obj.method, 100)这类场景第一时间暴露上下文丢失 - 函数参数重复名、八进制字面量(
0123)、with语句等被禁止,避免歧义和性能陷阱










