JavaScript 中 'use strict' 的作用及原理

JavaScript 中 ‘use strict’ 的作用及原理

技术背景

在 JavaScript 的早期版本中,语言的设计较为宽松,这虽然使得开发者编写代码更加便捷,但也容易导致一些难以调试的错误和不安全的行为。为了解决这些问题,ECMAScript 5 引入了严格模式(Strict Mode),通过使用 "use strict"; 指令来开启。严格模式对 JavaScript 的语法和行为进行了一些限制,使得代码更加安全、可靠,同时也便于静态分析工具进行检查。

实现步骤

全局开启严格模式

"use strict"; 放在脚本文件的顶部,整个脚本文件都将以严格模式执行。

1
2
3
"use strict";
// 后续代码都在严格模式下执行
var a = 1;

函数内部开启严格模式

"use strict"; 放在函数体的顶部,该函数及其内部嵌套的函数将以严格模式执行。

1
2
3
4
5
function myFunction() {
"use strict";
// 此函数内的代码在严格模式下执行
var b = 2;
}

ES6 模块和类中的严格模式

在原生 ECMAScript 模块(使用 importexport 语句)和 ES6 类中,严格模式是默认开启的,无需显式添加 "use strict";

1
2
3
4
5
6
7
8
9
10
11
12
13
// 模块中的严格模式
export function moduleFunction() {
// 此函数在严格模式下执行
let c = 3;
}

// 类中的严格模式
class MyClass {
constructor() {
// 此构造函数在严格模式下执行
this.d = 4;
}
}

核心代码

以下是一些在严格模式下会抛出错误,但在非严格模式下可能正常执行或静默失败的代码示例:

禁止隐式全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
// 非严格模式
function nonStrictFunction() {
x = 10; // 隐式创建全局变量
console.log(x);
}
nonStrictFunction();

// 严格模式
function strictFunction() {
"use strict";
y = 20; // 抛出 ReferenceError
}
strictFunction();

禁止重复参数名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 非严格模式
function nonStrictSum(a, a) {
return a + a;
}
console.log(nonStrictSum(1, 2)); // 正常执行

// 严格模式
function strictSum() {
"use strict";
// 抛出 SyntaxError
function sum(a, a) {
return a + a;
}
return sum(1, 2);
}
strictSum();

禁止删除不可删除的属性

1
2
3
4
5
6
7
8
9
// 非严格模式
delete Object.prototype; // 静默失败

// 严格模式
function strictDelete() {
"use strict";
delete Object.prototype; // 抛出 TypeError
}
strictDelete();

最佳实践

  • 新项目使用严格模式:在新项目中,建议从一开始就使用严格模式,这样可以培养良好的编码习惯,减少潜在的错误。
  • 结合静态分析工具:使用 JSHint、ESLint 等静态分析工具,配置严格的规则,帮助发现代码中的潜在问题。
  • 逐步引入严格模式:对于已有的项目,可以逐步在各个模块中引入严格模式,同时配合单元测试,确保代码的正确性。

常见问题

兼容性问题

早期的浏览器可能不支持严格模式,但由于 "use strict"; 只是一个字符串,不支持的浏览器会将其视为普通字符串,不会影响代码的执行。不过,在这些浏览器中,严格模式的限制将不起作用。

与旧代码的兼容性

在将严格模式引入已有项目时,可能会发现一些旧代码违反了严格模式的规则。这时候需要对这些代码进行修改,确保它们符合严格模式的要求。

性能问题

一般来说,严格模式不会对性能产生明显的影响。实际上,由于严格模式减少了一些复杂的语言特性,某些情况下可能会提高代码的执行效率。但具体情况还需要根据代码的实际情况进行测试。


JavaScript 中 'use strict' 的作用及原理
https://119291.xyz/posts/2025-04-16.javascript-use-strict-explanation/
作者
ww
发布于
2025年4月16日
许可协议