"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 早期设计中的很多“坑”,写出更健壮的代码。如果你接手了老旧的非严格模式代码,需要注意混用时的全局污染问题。