"use strict"(注意是带引号的字符串)是 JavaScript 进入严格模式的指令。
它的核心作用是:将代码的语法和运行时行为,限制在更安全、更严谨的子集里,从而提前发现潜在的错误,并禁用部分不安全的旧语法。
具体来说,它带来了以下关键变化:
禁止意外创建全局变量:未声明的变量直接赋值会报错(而不是悄悄成为全局变量)。
"use strict"; x = 10; // ❌ 报错:x is not defined静默失败转为显式报错:给不可写属性、只读属性赋值时,会抛出异常(而不是静默失败)。
"use strict"; var obj = {}; Object.defineProperty(obj, "x", { value: 1, writable: false }); obj.x = 2; // ❌ 报错:Cannot assign to read only property消除
this的强制装箱:函数中的this不再默认指向全局对象(浏览器中是window),而是保持为undefined。"use strict"; function test() { console.log(this); } test(); // 输出 undefined(非严格模式下输出 Window)禁止重复的参数名和对象属性名:函数参数重名、对象属性重名会报错(非严格模式下会取最后一个)。
"use strict"; function sum(a, a, c) { } // ❌ 语法错误:重复的参数名 var obj = { name: "a", name: "b" }; // ❌ 语法错误(旧版浏览器)禁用
with语句:with会无法确定代码块的作用域,严格模式下直接禁用,避免性能问题和阅读困难。保留未来的关键字:如
interface、let、private等不能用作变量名,为后续 ES 版本做准备。
如何使用?
- 全局使用:写在 JS 文件或
<script>标签的最顶部。 - 函数级别使用:写在函数体的第一行(仅对该函数生效)。
- 模块(ES Module)中自动开启:如果你使用
import/export,则无需显式添加,所有代码默认处于严格模式。
建议:在新项目中始终使用严格模式(直接写 ES Module 或用构建工具自动添加),它能帮你避开 JavaScript 早期设计中的很多“坑”,写出更健壮的代码。如果你接手了老旧的非严格模式代码,需要注意混用时的全局污染问题。