什么是javascript严格模式_如何启用它有什么好处【教程】

严格模式是通过"use strict"启用的运行时约束开关,会将静默失败转为报错;必须置于脚本顶部或函数首行,拦截with、只读属性赋值、重复参数等危险操作,并限制eval和arguments行为;ES6模块等现代环境默认启用,CommonJS仍需手动声明。

JavaScript 严格模式不是“新语法”,而是对运行时行为的约束开关——启用后,原本静默失败或怪异的行为会直接报错,

帮你提前暴露问题。

如何在代码中启用严格模式

严格模式必须通过字面量字符串 "use strict" 声明,且必须出现在脚本顶部或函数体第一行(前面不能有其他语句,包括注释也不行):

"use strict";
function foo() {
  "use strict"; // 函数级启用,只影响该函数内
  delete x; // 报错:Cannot delete unqualified identifier
}

常见错误写法:

  • 放在 iffor 里 —— 不生效
  • 前面有空行或注释 —— 全局模式失效(函数内仍可能生效)
  • 'use strict' 单引号 —— 合法但不推荐,保持统一即可

严格模式下哪些操作会报错而非静默忽略

它主要拦截三类“危险默认”:

  • with 语句被完全禁止(with 会导致作用域链不可预测)
  • 给只读属性赋值(如 NaN = 1undefined = 2)抛出 TypeError
  • 删除不可配置属性(delete Object.prototype)报错,而非返回 false
  • 函数参数名重复(function f(a, a) {})在严格模式下是语法错误
  • this 在非对象调用中不再自动绑定到全局对象(foo()thisundefined,而不是 windowglobal

严格模式对 evalarguments 的限制

这两个机制在非严格模式下有大量隐式行为,严格模式大幅收紧:

  • eval 不再能声明变量或函数(eval("var x = 1") 不会污染外层作用域)
  • arguments 不再与形参自动同步(修改 arguments[0] 不再影响对应参数变量)
  • arguments.calleearguments.caller 被禁用(它们阻碍优化且易引发混淆)

这意味着依赖 arguments.callee 实现递归的旧代码,在严格模式下会直接报 ReferenceError

现代开发中是否还需要手动加 "use strict"

基本不需要了。ES6 模块(.mjsimport/export 文件)默认启用严格模式;Babel、TypeScript 等工具输出也默认包含;Node.js 的 ES 模块环境同样强制严格。

唯一还需留意的是:CommonJS 模块(require() 加载的 .js)仍默认非严格,如果你写的是纯 CJS 工具脚本、或需要兼容老 Node 版本,仍建议显式声明。

真正容易被忽略的点是:严格模式的边界由声明位置决定,不是文件级或项目级开关——混用严格与非严格代码时,函数内部是否报错,只取决于它自己有没有那行 "use strict"