在现代 JavaScript 开发中,"use strict"; 是一个非常重要的指令,它开启了所谓的“严格模式”。了解其含义、作用以及与普通模式的区别,对于编写更加安全、高效的代码至关重要。
✅ 一句话总结
"use strict";是一种用于指示 JavaScript 编译器以严格模式执行代码的声明。相比普通模式,它增强了安全性、避免了潜在错误,并且优化了性能。
✅ 一、什么是 "use strict"?
🔹 定义
"use strict";是一个字面量表达式,出现在脚本或函数的顶部。- 它不是一条语句,而是一个编译指示(Directive Prologue),告诉 JavaScript 引擎启用严格模式来解析和执行后续代码。
🔹 使用方式
-
全局范围:将
"use strict";放置在脚本文件的第一行。"use strict"; // 整个脚本都将遵循严格模式规则 -
局部范围:放置在函数内部的第一行,仅对该函数有效。
function strictFunction() { "use strict"; // 仅该函数遵循严格模式规则 }
✅ 二、严格模式下的主要变化
🔹 1. 禁止使用未声明的变量
// 普通模式下不会报错
a = 5; // a 自动成为全局变量
// 严格模式下会抛出 ReferenceError
"use strict";
b = 5; // Uncaught ReferenceError: b is not defined
🔹 2. 禁止删除变量或函数
"use strict";
var x = 42;
delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.
🔹 3. 静态绑定 this
- 在非严格模式下,当函数内的
this为undefined或者是全局对象时,this会被自动转换为全局对象(如window); - 在严格模式下,
this的值保持不变,如果未定义则为undefined。
function testThis() {
console.log(this);
}
// 普通模式下输出 window 对象
testThis(); // Window {...}
// 严格模式下输出 undefined
(function() {
"use strict";
testThis(); // undefined
})();
🔹 4. 禁止八进制数字语法
// 普通模式允许八进制数字(尽管不推荐)
var num = 010; // 等于8
// 严格模式禁止八进制数字
"use strict";
var num = 010; // SyntaxError: Octal literals are not allowed in strict mode.
🔹 5. 函数参数限制
- 不允许重复的参数名称;
- 如果存在重复参数名,在严格模式下会抛出
SyntaxError。
// 普通模式下不会报错
function func(a, a) { } // 警告但不报错
// 严格模式下会报错
"use strict";
function func(a, a) { } // SyntaxError: Duplicate parameter name not allowed in this context
🔹 6. 更严格的 eval() 行为
- 在严格模式下,
eval()创建的新变量不会污染外部作用域。
// 普通模式下 eval 内的变量会影响外部作用域
var x = 10;
eval("var x = 20");
console.log(x); // 输出 20
// 严格模式下 eval 内的变量不会影响外部作用域
"use strict";
var y = 10;
eval("var y = 20");
console.log(y); // 输出 10
✅ 三、为什么应该使用 "use strict"?
🔹 提高代码安全性
- 防止意外创建全局变量;
- 禁止不当使用
this; - 增强对变量和属性的访问控制;
🔹 提升代码质量
- 避免常见错误,如拼写错误导致的未定义变量;
- 更清晰的语法限制,减少模糊性和不确定性;
- 促进更好的编程习惯;
🔹 性能优化
- 严格模式下的某些特性可以被引擎更好地优化;
- 减少了运行时检查的需求,提高了执行效率;
✅ 四、普通模式 vs 严格模式:对比示例
🔹 示例 1:未声明变量
// 普通模式
x = 5; // 全局变量
console.log(window.x); // 5
// 严格模式
"use strict";
y = 5; // ReferenceError: y is not defined
🔹 示例 2:函数内的 this
// 普通模式
function testThis() {
console.log(this); // Window {...}
}
testThis();
// 严格模式
"use strict";
function testThisStrict() {
console.log(this); // undefined
}
testThisStrict();
🔹 示例 3:重复参数名
// 普通模式
function func(a, a) { } // 仅警告
// 严格模式
"use strict";
function funcStrict(a, a) { } // SyntaxError: Duplicate parameter name not allowed in this context
✅ 五、一句话总结
"use strict";指令通过增强的安全性、更严格的语法规范以及潜在的性能提升,帮助开发者编写更健壮、可维护的 JavaScript 代码。建议所有新项目都采用严格模式。
💡 最佳实践
- 始终开启严格模式:无论是新项目还是旧项目的重构,都应该考虑使用严格模式;
- 模块化开发:ES6 模块默认处于严格模式,无需显式声明;
- 注意兼容性:虽然几乎所有现代浏览器都支持严格模式,但在处理遗留代码时仍需谨慎;
- 利用工具链:使用 ESLint 等工具强制执行严格模式,确保一致性;