JavaScript 严格模式(use strict)(实战指南)

JavaScript 严格模式(use strict):让代码更安全、更清晰

在 JavaScript 的发展过程中,语言本身经历了从“宽松”到“严谨”的演进。早期的 JavaScript 设计时为了快速上手,允许开发者写出很多“不规范”的代码,比如随意创建全局变量、使用未声明的变量等。这种“宽容”虽然降低了学习门槛,但长期来看却带来了难以调试的 bug 和潜在的性能问题。

如今,我们有了一个非常强大的工具——JavaScript 严格模式(use strict)。它就像一位严谨的代码审查员,帮你发现那些“看起来没问题,其实有隐患”的写法。无论你是初学者还是有一定经验的开发者,掌握严格模式都能让你的代码质量显著提升。


什么是 JavaScript 严格模式(use strict)

严格模式是一种特殊的执行上下文,它在代码运行前就开启了一系列更严格的检查规则。你可以把它理解为 JavaScript 的“安全驾驶模式”——一旦开启,语言会强制你遵守更清晰的编程规范,避免一些常见的“坑”。

开启严格模式非常简单,只需在脚本或函数的开头添加 "use strict"; 这一行字符串。注意,它必须放在文件顶部或函数体的第一行,否则不会生效。

"use strict";

// 这里的代码将运行在严格模式下
console.log("Hello, strict mode!");

⚠️ 重要提示:"use strict"; 是一个字符串字面量,不是变量或函数。它不会被当作普通字符串处理,而是被 JavaScript 引擎识别为开启严格模式的指令。


严格模式如何提升代码安全性

防止意外的全局变量污染

在非严格模式下,如果你写错变量名,JavaScript 会自动创建一个全局变量,这很容易造成命名冲突和难以追踪的 bug。

// 非严格模式下的危险写法
function calculateArea() {
    area = 100; // 漏掉了 let/const/var
    console.log(area);
}

calculateArea();
// 输出: 100
// 但你可能没意识到:area 成了一个全局变量!

在严格模式下,这种写法会直接报错:

"use strict";

function calculateArea() {
    area = 100; // ❌ ReferenceError: area is not defined
    console.log(area);
}

calculateArea();

💡 比喻:这就像你开车时忘记系安全带,系统不会立刻提醒你,但一旦出事就很难挽回。而严格模式就是那个“安全带提醒系统”,让你在犯错前就停止。


限制 this 的隐式绑定

this 是 JavaScript 中最容易引起困惑的概念之一。在非严格模式下,this 的值取决于函数的调用方式,有时会意外指向全局对象(浏览器中是 window)。

"use strict";

function showThis() {
    console.log(this); // ❌ 在严格模式下,this 为 undefined
}

showThis(); // 输出: undefined

而在非严格模式下,this 会指向 window。这会导致逻辑错误,尤其是在类方法或事件处理中。

✅ 严格模式强制 this 必须显式绑定,避免“this 指向混乱”的问题。你必须使用 .call().apply() 或箭头函数来明确控制上下文。


禁止重复的参数名

在非严格模式中,你可以这样写:

function badFunction(a, a, b) {
    return a + b;
}

虽然语法上合法,但 a 被定义了两次,很容易造成混淆。严格模式直接禁止这种写法:

"use strict";

function badFunction(a, a, b) { // ❌ SyntaxError: Duplicate parameter name not allowed in this context
    return a + b;
}

🧩 这就像你在写一篇论文,结果用了两个相同的标题,读者会不知道你到底想表达什么。严格模式帮你避免“重复定义”的混乱。


严格模式的常见应用场景

1. 模块化开发(ES Modules)

在 ES6 的模块系统中,importexport 本身就默认启用严格模式。因此,你不需要手动加 "use strict",但理解其行为仍然重要。

// mathUtils.js
export function add(a, b) {
    return a + b;
}

export function multiply(a, b) {
    return a * b;
}

// 在其他文件中导入
import { add } from './mathUtils.js';

✅ 提示:所有 .js 模块文件默认运行在严格模式下,即使你没写 "use strict"


2. 箭头函数与类方法

箭头函数天然绑定 this,不支持 arguments,在严格模式下表现一致。

"use strict";

const obj = {
    name: "Alice",
    greet: () => {
        console.log(`Hello, I'm ${this.name}`); // ❌ this 指向的是外层作用域,不是 obj
    },
    regularGreet: function () {
        console.log(`Hello, I'm ${this.name}`); // ✅ this 指向 obj
    }
};

obj.greet(); // 输出: Hello, I'm undefined
obj.regularGreet(); // 输出: Hello, I'm Alice

📌 严格模式下,箭头函数的 this 行为更加可预测,但需注意它不绑定 this,而是继承外层作用域。


3. 避免删除不可删除的属性

在非严格模式下,你可以删除 undefinednull 等不可删除的属性,但严格模式会阻止这一行为。

"use strict";

delete Object.prototype; // ❌ TypeError: Cannot delete property 'prototype' of function Object() { [native code] }

🔒 这保护了 JavaScript 的核心对象,防止意外破坏语言基础。


严格模式的常见误区与注意事项

误区 说明 正确做法
严格模式会降低性能 实际上,现代引擎对严格模式有优化,性能影响极小 无需担心性能问题
严格模式只能在函数内使用 可以在文件顶部使用,全局生效 推荐在文件开头写 "use strict";
严格模式会报错所有错误 它只对特定规则进行检查,不是万能的 仍需配合测试和代码审查

实际项目中的最佳实践

在真实项目中,建议你:

  1. 在所有脚本文件顶部添加 "use strict";
  2. 使用工具如 ESLint + strict 规则,自动检查未开启严格模式的文件
  3. 在函数内部开启严格模式,如果只部分代码需要严格行为
// 推荐:文件级开启严格模式
"use strict";

// 所有函数都运行在严格模式下
function validateUser(username, password) {
    if (!username || !password) {
        throw new Error("用户名和密码不能为空");
    }
    return true;
}

✅ 你也可以在函数内部开启严格模式,但建议统一在文件开头开启,保持一致性。


总结:为什么你应该尽早使用严格模式

JavaScript 严格模式(use strict) 不是可有可无的功能,而是现代 JavaScript 开发的“基础标配”。它虽然在初学阶段可能让你遇到一些“报错”,但这些报错恰恰是帮你养成良好编码习惯的“警钟”。

  • 它阻止你创建意外的全局变量
  • 它让 this 的行为更可预测
  • 它禁止语法歧义,提升代码可读性
  • 它为未来升级(如 TypeScript、模块化)打下基础

📌 最后提醒:从今天开始,在你的每一个 .js 文件顶部加上 "use strict";,就像你开车前先系好安全带一样简单,却能避免未来大麻烦。

别再让“宽松”成为你代码的借口。开启严格模式,让你的 JavaScript 更安全、更清晰、更专业。