JavaScript严格模式通过在第一行写入use strict来启用,它不只是让报错更明显,还悄悄改变了语言的一些底层行为。不少限制平时不会触发,一旦踩中就会带来难以排查的问题。

容易被忽略的严格模式限制
1. 不能删除变量或函数
在非严格模式中,删除一个未使用var声明的全局变量可能不会报错,但严格模式下直接抛出语法错误。
'use strict'; var a = 1; delete a; // TypeError: Cannot delete variable a b = 2; delete b; // 同样报错
2. 给只读属性赋值会抛错
通过Object.defineProperty定义的只读属性,在严格模式下赋值会直接报错,而非严格模式只是静默失败。
'use strict';
var obj = {};
Object.defineProperty(obj, 'x', { value: 1, writable: false });
obj.x = 2; // TypeError: Cannot assign to read only property
3. 函数参数不能重名
很多人不知道,参数名重复在严格模式里是语法错误。
'use strict';
function sum(a, a) { // SyntaxError
return a + a;
}
4. 禁止使用八进制字面量
以0开头的数字会被视为八进制,严格模式中不允许这种写法。
'use strict'; var n = 010; // SyntaxError: Octal literals are not allowed
5. 禁止with语句
with会改变作用域链,严格模式直接禁用。
'use strict';
with (Math) { // SyntaxError
var x = random();
}
6. eval和arguments受限
严格模式下,eval内部声明的变量不会泄漏到外部,也不能给eval或arguments赋值。
'use strict';
eval('var y = 3;');
console.log(typeof y); // undefined
arguments = []; // SyntaxError
总结对照表
| 行为 | 非严格模式 | 严格模式 |
|---|---|---|
| 删除var变量 | 报错或无效 | 直接TypeError |
| 写只读属性 | 静默失败 | 抛错 |
| 函数重名参数 | 允许 | 语法错误 |
| 八进制字面量 | 允许 | 语法错误 |
| with语句 | 允许 | 禁用 |
建议
在模块(ES Module)中代码默认就是严格模式,因此这些限制其实已经普遍存在于现代项目中。使用lint工具可以在编码阶段发现大部分问题,同时理解这些限制有助于写出更可预测的JavaScript代码。
JavaScriptstrict_modeES5修改时间:2026-07-28 02:57:09