"use strict";
是 JavaScript 中的一个指令,用于开启严格模式(Strict Mode)。它不是一条语句,而是一个字面量表达式,告诉 JavaScript 引擎以更严格的标准来解析和执行代码。
你可以将 "use strict";
放在脚本的顶部(全局严格模式)或函数的开头(函数级严格模式)。
// 全局严格模式
"use strict";
// 后续所有代码都在严格模式下执行
function myFunction() {
"use strict";
// 只有这个函数内的代码在严格模式下执行
}
开启严格模式后的主要区别
严格模式的主要目的是消除 JavaScript 语言中一些不安全、不严谨的语法和行为,使代码更安全、更高效,并为未来的 ECMAScript 版本铺路。
1. 禁止意外创建全局变量
在非严格模式下,给未声明的变量赋值会自动创建一个全局变量,这通常是错误的根源。
// 非严格模式
function foo() {
x = 10; // 没有 var/let/const,但不会报错
}
foo();
console.log(x); // 10 (x 成为了全局变量)
// 严格模式
function bar() {
"use strict";
y = 20; // 报错!ReferenceError: y is not defined
}
bar();
2. 禁止删除变量、函数和函数参数
// 非严格模式
var a = 1;
delete a; // 不报错,但通常无效
console.log(a); // 1
// 严格模式
"use strict";
var b = 2;
delete b; // 报错!SyntaxError: Delete of an unqualified identifier in strict mode.
3. 函数参数名不能重复
// 非严格模式
function func1(a, a) { // 允许,但第二个参数会覆盖第一个
console.log(a); // 输出第二个传入的值
}
// 严格模式
"use strict";
function func2(a, a) { // 报错!SyntaxError: Duplicate parameter name not allowed in this context
}
4. eval
和 arguments
的行为更安全
eval
在严格模式下创建的变量不会泄露到外部作用域。arguments
对象是函数参数的静态副本,修改参数不会影响arguments
,反之亦然。- 不能使用
arguments.callee
(常用于匿名函数递归)。
// 严格模式
"use strict";
function func3(a) {
a = 10;
console.log(arguments[0]); // 仍然是传入的原始值,不会随 a 的改变而改变
}
5. this
不再指向全局对象
在非严格模式下,独立函数中的 this
会自动绑定到全局对象(浏览器中是 window
)。严格模式下,this
为 undefined
。
// 非严格模式
function f1() {
return this; // 返回 window 对象
}
console.log(f1() === window); // true
// 严格模式
"use strict";
function f2() {
return this; // 返回 undefined
}
console.log(f2() === undefined); // true
6. 禁止八进制语法
// 严格模式
"use strict";
var octal = 010; // 报错!SyntaxError: Octal literals are not allowed in strict mode.
7. 更多语法限制
- 保留字限制更严格(如
implements
,interface
,let
,package
,private
,protected
,public
,static
,yield
等在严格模式下是保留字,不能用作变量名)。 - 禁止使用
with
语句。
为什么使用 "use strict"
?
- 捕获错误:让一些“静默失败”的错误变成显式的运行时错误,便于调试。
- 提高安全性:防止意外的全局变量污染。
- 提高性能:严格模式下的代码通常可以被 JavaScript 引擎更好地优化。
- 为未来铺路:避免使用未来版本可能废弃的语法。
- 代码更清晰:强制开发者写出更严谨、更规范的代码。
总结
"use strict";
是一个简单而强大的工具,它通过启用一组更严格的解析和执行规则,帮助开发者避免常见的陷阱,写出更安全、更可靠、更高效的 JavaScript 代码。在现代 JavaScript 开发中,强烈推荐在所有脚本或模块中使用严格模式。
THE END