JavaScript 严格模式(use strict)

关键点

  • 严格模式"use strict")是 JavaScript 的运行模式,通过在代码顶部添加 "use strict"; 启用,增强代码安全性并减少错误。
  • 它修复了 JavaScript 的一些不合理行为,如禁止未声明变量、限制 this 的默认绑定、防止重复参数名等。
  • 严格模式适用于整个脚本或单个函数,推荐在现代 JavaScript 开发中使用。
  • 需注意兼容性问题,旧代码可能因严格模式报错。

严格模式详解

1. 什么是严格模式?

严格模式是 ECMAScript 5(ES5)引入的一种特殊运行模式,通过在脚本或函数顶部添加 "use strict"; 启用。它改变了 JavaScript 的执行方式,消除了部分不安全或易错的行为,使代码更健壮、更易于调试。

根据 MDN Web Docs – 严格模式,严格模式通过抛出错误来强制执行更严格的规则,防止潜在的 bug。

2. 如何启用严格模式?

严格模式可以通过以下方式启用:

  • 全局启用:在脚本文件顶部添加 "use strict";
  "use strict";
  x = 10; // 错误:x 未声明
  • 函数内启用:在函数顶部添加 "use strict";,仅对该函数有效。
  function strictFunction() {
    "use strict";
    y = 20; // 错误:y 未声明
  }
  function nonStrictFunction() {
    z = 30; // 无错误,z 成为全局变量
  }

根据 W3School – JavaScript 严格模式,全局启用适合新项目,而函数内启用适合逐步改造旧代码。

3. 严格模式的限制与变化

严格模式引入了多项限制,修复了 JavaScript 的不合理行为。以下是主要变化:

3.1 禁止未声明变量
  • 非严格模式下,未声明的变量(如 x = 10)会自动成为全局变量,可能导致意外污染全局作用域。
  • 严格模式下,抛出 ReferenceError
  "use strict";
  x = 10; // ReferenceError: x is not defined
3.2 禁止删除不可删除的属性
  • 非严格模式下,尝试删除不可配置的属性(如 Object.prototype)会静默失败。
  • 严格模式下,抛出 TypeError
  "use strict";
  delete Object.prototype; // TypeError
3.3 函数参数名不能重复
  • 非严格模式下,函数允许重复参数名,后者覆盖前者。
  • 严格模式下,抛出 SyntaxError
  "use strict";
  function sum(a, a) { return a; } // SyntaxError: Duplicate parameter name
3.4 限制 this 的默认绑定
  • 非严格模式下,普通函数中的 this 默认绑定到全局对象(浏览器中为 window)。
  • 严格模式下,thisundefined,避免意外修改全局对象。
  "use strict";
  function showThis() {
    console.log(this); // undefined
  }
  showThis();
3.5 禁止使用 with 语句
  • with 语句因性能差和不明确的作用域被严格模式禁用,抛出 SyntaxError
  "use strict";
  with (Math) { console.log(PI); } // SyntaxError
3.6 禁止八进制字面量
  • 非严格模式下,允许使用八进制(如 010 表示 8)。
  • 严格模式下,抛出 SyntaxError
  "use strict";
  let num = 010; // SyntaxError
3.7 限制 argumentseval
  • 严格模式下,arguments 对象不再与函数参数动态绑定,修改 arguments 不会影响参数。
  "use strict";
  function test(a) {
    arguments[0] = 100;
    console.log(a); // 仍为原始值,未被修改
  }
  test(10);
  • eval 不再创建全局变量,且有独立的作用域。
  "use strict";
  eval("var x = 10");
  console.log(typeof x); // undefined
3.8 其他限制
  • 禁止将 evalarguments 用作变量名或函数名。
  • 函数必须在作用域顶部声明,不能在 if 等块中声明。
  • delete 变量或函数会抛出 SyntaxError

根据 菜鸟教程 – JavaScript 严格模式,这些限制使代码更规范,减少了潜在的错误。

4. 使用场景与最佳实践

  • 场景
  • 新项目:推荐全局启用严格模式,确保代码遵循现代标准。
  • 旧项目:逐步在函数内启用,测试兼容性后扩展。
  • 库开发:使用严格模式,防止污染全局作用域。
  • 最佳实践
  • 在所有新代码中启用 "use strict";,尤其是在模块化开发中(ES6 模块默认启用严格模式)。
  • 使用 letconst 替代 var,结合严格模式减少提升问题。
  • 测试旧代码的兼容性,注意严格模式可能导致的错误(如未声明变量)。
  • 使用工具(如 ESLint)强制严格模式规则,提升代码质量。

5. 示例与分析

以下示例展示严格模式的影响:

场景非严格模式行为严格模式行为
未声明变量x = 10 创建全局变量ReferenceError: x is not defined
重复参数名function f(a, a) {} 允许SyntaxError: Duplicate parameter name
删除不可删除属性delete Object.prototype 静默失败TypeError
函数内 this绑定到 windowundefined
八进制字面量010 表示 8SyntaxError

详细示例

"use strict";
function example() {
  x = 10; // ReferenceError
  console.log(this); // undefined
  function sum(a, a) { // SyntaxError
    return a;
  }
}
example();

6. 历史与争议

严格模式是 ES5 的重要改进,旨在修复 JavaScript 的设计缺陷,如全局变量泄漏和不安全的 this 绑定。然而,部分开发者认为严格模式增加了学习曲线,尤其是在改造旧代码时可能引发兼容性问题。根据 CSDN – JavaScript 严格模式详解,社区普遍认可严格模式的优点,但建议谨慎应用于遗留系统。

7. 注意事项

  • 兼容性:严格模式在所有现代浏览器中支持,但在 IE9 及以下版本可能不完全支持。
  • 模块化:ES6 模块和类默认运行在严格模式,无需手动声明 "use strict";
  • 调试:严格模式通过抛出错误帮助调试,但可能暴露旧代码中的潜在问题。

8. 总结

  • 严格模式通过 "use strict"; 启用,强制执行更严格的规则,提升代码安全性和可维护性。
  • 它修复了 JavaScript 的不合理行为,如未声明变量、重复参数名和 this 的默认绑定。
  • 推荐在现代开发中始终使用严格模式,结合 letconst 编写更可靠的代码。

关键引用

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注