js严格模式
js严格模式
JavaScript 的严格模式(Strict Mode)是一种运行模式,它对 JavaScript 代码施加更严格的语法和行为限制,旨在减少一些常见的编程错误,提高代码的可读性和可维护性。严格模式在 ES5 中引入,并在 ES6 中得到了进一步的扩展和改进。
启用严格模式
要启用严格模式,只需在 JavaScript 文件或函数的顶部添加 "use strict"; 声明。这行声明必须是脚本或函数体中的第一条可执行语句。
全局严格模式
1 | ; |
函数严格模式
1 | function greet() { |
严格模式的特点
- 禁止使用
with语句:with语句会导致作用域链的动态变化,容易引起混淆和错误。严格模式下,使用with语句会抛出语法错误。
1
2
3
4;
with (obj) { // SyntaxError: Strict mode code may not include a with statement
console.log(obj.prop);
} - 禁止使用
arguments.callee:arguments.callee用于引用当前正在执行的函数,但在严格模式下,它被禁止使用,以避免潜在的性能问题。
1
2
3
4
5;
function factorial(n) {
if (n <= 1) return 1;
return n * arguments.callee(n - 1); // TypeError: 'callee' and 'caller' are read-only properties
} - 禁止删除不可删除的属性:
- 在严格模式下,尝试删除不可删除的属性会抛出
TypeError。
- 在严格模式下,尝试删除不可删除的属性会抛出
1 | ; |
- 禁止使用
eval创建变量:- 在严格模式下,
eval代码中的变量不会被提升到包含它的作用域中。
1
2
3;
eval("var x = 10;");
console.log(x); // ReferenceError: x is not defined - 在严格模式下,
- 禁止使用
arguments.caller和arguments.callee:- 这些属性在严格模式下被禁止使用,以避免潜在的性能问题。
1
2
3
4
5;
function myFunction() {
console.log(arguments.caller); // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
}
myFunction(); - 禁止使用
this指向全局对象:- 在严格模式下,函数中的
this不再指向全局对象(window),而是undefined。
1
2
3
4
5;
function test() {
console.log(this); // undefined
}
test(); - 在严格模式下,函数中的
- 禁止使用
new Function创建函数时的this指向全局对象:- 在严格模式下,使用
new Function创建的函数中的this也不再指向全局对象,而是undefined。
1
2
3;
var f = new Function("console.log(this)");
f(); // undefined - 在严格模式下,使用
- 禁止使用前缀
0表示八进制数:- 在严格模式下,前缀
0不再表示八进制数,而是十进制数。
1
2;
var x = 010; // SyntaxError: Octal literals are not allowed in strict mode. - 在严格模式下,前缀
严格模式的好处
- 减少常见错误:严格模式通过禁止一些容易引起错误的语法和行为,帮助开发者编写更健壮的代码。
- 提高性能:严格模式下的代码通常比非严格模式下的代码执行得更快,因为一些优化措施在严格模式下更容易实现。
- 更好的工具支持:严格模式下的代码更容易被静态分析工具分析,从而提供更好的代码检查和优化建议。
总结
严格模式是 JavaScript 中的一种运行模式,通过施加更严格的语法和行为限制,帮助开发者编写更健壮、更高效的代码。通过在脚本或函数的顶部添加 "use strict"; 声明,可以启用严格模式。严格模式禁止了一些容易引起错误的语法和行为,如 with 语句、arguments.callee、删除不可删除的属性等,从而减少常见错误,提高代码的可读性和可维护性。