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
)。 - 严格模式下,
this
为undefined
,避免意外修改全局对象。
"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 限制 arguments
和 eval
- 严格模式下,
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 其他限制
- 禁止将
eval
或arguments
用作变量名或函数名。 - 函数必须在作用域顶部声明,不能在
if
等块中声明。 delete
变量或函数会抛出SyntaxError
。
根据 菜鸟教程 – JavaScript 严格模式,这些限制使代码更规范,减少了潜在的错误。
4. 使用场景与最佳实践
- 场景:
- 新项目:推荐全局启用严格模式,确保代码遵循现代标准。
- 旧项目:逐步在函数内启用,测试兼容性后扩展。
- 库开发:使用严格模式,防止污染全局作用域。
- 最佳实践:
- 在所有新代码中启用
"use strict";
,尤其是在模块化开发中(ES6 模块默认启用严格模式)。 - 使用
let
和const
替代var
,结合严格模式减少提升问题。 - 测试旧代码的兼容性,注意严格模式可能导致的错误(如未声明变量)。
- 使用工具(如 ESLint)强制严格模式规则,提升代码质量。
5. 示例与分析
以下示例展示严格模式的影响:
场景 | 非严格模式行为 | 严格模式行为 |
---|---|---|
未声明变量 | x = 10 创建全局变量 | ReferenceError: x is not defined |
重复参数名 | function f(a, a) {} 允许 | SyntaxError: Duplicate parameter name |
删除不可删除属性 | delete Object.prototype 静默失败 | TypeError |
函数内 this | 绑定到 window | undefined |
八进制字面量 | 010 表示 8 | SyntaxError |
详细示例:
"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
的默认绑定。 - 推荐在现代开发中始终使用严格模式,结合
let
和const
编写更可靠的代码。