"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 不再与形参自动绑定。
立即学习“Java免费学习笔记(深入)”;
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 行为就会不一致。











