"use strict"必须写在脚本顶部或函数体开头,因其作用域为词法作用域且仅对紧随其后的代码生效;写在条件语句或函数中间会被忽略。
JavaScript 严格模式("use strict")不是新语言,而是对 JavaScript 执行环境的一种限制性“开关”——开启后,引擎会禁用一些不安全、易出错、或已被废弃的语法和行为,并抛出更明确的错误,而不是静默失败。
"use strict" 必须写在脚本顶部或函数体开头?因为严格模式的作用域是词法作用域,且只对紧随其后的代码生效。如果写在条件语句里、或函数中间,会被忽略:
"use strict";
if (false) {
"use strict"; // ❌ 无效:引擎在解析阶段就跳过它
}
function foo() {
console.log(this); // ✅ 在严格模式下,this 是 undefined(非对象调用时)
}
"use strict"(或 'use strict'),不能有前置空行或注释.mjs 或 import 加载的脚本)默认启用严格模式,无需显式声明它主要堵住三类漏洞:静默失败、意外全局变量、以及容易混淆的 this 绑定。
with 语句被完全禁止 —— 因为它让作用域链不可预测,V8 等引擎无法优化NaN = 1、undefined = 2、Object.prototype.x = 3)会抛出 TypeError,而非静默忽略
明变量直接赋值(如 foo = 42)会报 ReferenceError,而不是意外创建全局变量 window.foo
function f(a, a) { })在严格模式下是语法错误,普通模式中第二个参数会覆盖第一个010)被禁用,必须写成 0o10 或 0x10
this 和 arguments?这是最容易踩坑的地方:非严格模式下,顶层函数中的 this 指向全局对象(window 或 globalThis),而严格模式下是 undefined;同时 arguments 不再与形参自动绑定。
function loose() {
console.log(this === window); // true(浏览器中)
a = 1;
return arguments[0];
}
loose(42); // ✅ 正常运行
function strict() {
"use strict";
console.log(this === undefined); // true
a = 1; // ❌ ReferenceError: a is not defined
return arguments[0];
}
strict(42); // ✅ 返回 42,但 arguments 不响应形参修改
this 和 arguments
eval 在严格模式下也获得独立作用域,不会污染外层变量arguments.callee 和 arguments.caller 被禁用(它们曾用于递归匿名函数,但阻碍优化)严格模式的价值不在“多做了什么”,而在“少容忍了什么”。现代开发中它已是事实标准,但要注意:动态拼接字符串执行(eval("..."))、第三方脚本未声明严格模式、或旧版 polyfill 可能破坏它的边界效果。真正棘手的是混合模式 —— 一个模块里部分函数开了严格模式,部分没开,this 行为就会不一致。