javascript严格模式通过收紧执行规则将静默错误转为明确报错,禁止隐式全局变量、未声明变量使用、默认this绑定,禁用with语句、八进制字面量、重复参数及属性名,并强化对象只读、删除限制及eval/arguments保留词约束。

JavaScript 严格模式通过收紧执行规则,把原本“静默容忍”的错误变成明确报错,让问题在开发阶段就暴露出来。它不是增加新功能,而是移除容易出错的模糊地带。
禁止隐式创建全局变量
没用 let、const 或 var 就直接赋值,比如 name = "Tom",在非严格模式下会悄悄挂到 window 上;严格模式下直接抛出 ReferenceError。
- 必须先声明再使用:用
let name = "Tom"替代裸赋值 - 函数内未声明变量也会报错,不会意外污染外层作用域
限制 this 的默认绑定
普通函数独立调用时(如 foo()),严格模式下 this 是 undefined,而非非严格模式下的全局对象(window 或 global)。
- 避免意外修改全局状态,比如
this.x = 1不再静默生效 - 箭头函数不受影响,它本身就不绑定
this - 需要明确上下文时,用
call、bind或apply
禁用易引发歧义的语法结构
一些历史遗留但难维护、难优化的写法被直接禁止:
-
with语句:动态作用域会导致性能下降和调试困难,直接报SyntaxError - 八进制字面量:像
010这种写法被禁用,应改用0o10(ES6+ 推荐)或十进制 - 重复参数名:
function f(a, a) {}在严格模式下是语法错误 - 重复对象属性名:
{a: 1, a: 2}同样触发SyntaxError
强化对象与内置行为的安全约束
对对象操作和特殊标识符施加更严格的检查:
- 不能给只读属性赋值:如果
writable: false,obj.prop = 123抛TypeError - 不能删除变量、函数或参数:
delete x或delete myFunc报错 -
eval和arguments成为保留词:不能用作变量名、函数名或参数名 -
eval内部声明的变量不泄露到外层;arguments不再与形参自动同步 - 冻结/密封对象不可扩展:对
Object.freeze(obj)后的对象添加属性会立即报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











