严格模式启用后,with语句、给只读属性赋值、删除不可配置属性、函数参数名重复、访问arguments.callee/caller均会直接报错。
JavaScript 严格模式("use strict")不是新语法,而是一组限制性语义规则。一旦启用,原本“静默失败”的错误行为会变成显式 TypeError 或 SyntaxError。
with 语句被完全禁止,使用即抛 SyntaxError
NaN = 1、undefined = 2)触发 TypeError
delete Object.prototype)报 TypeError
function foo(a, a) {})在严格模式下是 SyntaxError
arguments.callee 和 arguments.caller 被禁用,访
问即 TypeError
eval 和 arguments 在严格模式下变“干净”了?非严格模式中,eval 可以在当前作用域动态声明变量或函数,导致静态分析失效;arguments 对象与形参自动绑定(修改 arguments[0] 会同步改 a),造成隐蔽副作用。
eval 总是在独立作用域执行,不影响外层变量arguments 不再与形参共享内存 —— 修改 arguments[0] 不影响参数变量 a,反之亦然arguments 作标识符(function f(arguments) {} 是语法错误)this 的历史混乱?非严格模式下,全局函数调用时 this 指向 window(浏览器)或 global(Node.js),容易引发意外的全局污染和 this 绑定丢失。
this 为 undefined,避免隐式绑定到全局对象call/apply/bind 传入 null 或 undefined 时,this 就是 null/undefined,不再自动转*局对象this),但普通函数的行为更可预测"use strict" 吗?现代 JavaScript 模块(.mjs 文件、import/export 的脚本)默认启用严格模式,无需显式声明。但传统 标签或 CommonJS 模块仍需手动开启。
class)内部所有方法自动运行在严格模式下"use strict",尤其当代码可能被拼接或压缩时 —— 压缩工具有时会破坏字符串字面量位置"use strict";
function foo() {
// 这里是严格模式
console.log(this); // undefined,而非 window
}
真正容易被忽略的是:严格模式的边界由作用域决定,不是文件级开关。一个函数内用了 "use strict",只影响该函数及其嵌套函数,不影响外部或同级其他函数。