JavaScript的严格模式(“use strict”)是一种特殊的运行模式,它为JavaScript引入了不同的解析和执行模型。启用严格模式可以帮助你写出更安全、更易于管理的代码。以下是严格模式相对于非严格模式的一些主要变化:
1. 变量必须声明
在严格模式下,所有变量必须先声明再使用。如果你尝试使用未声明的变量,JavaScript将抛出错误。
"use strict";
x = 23; // ReferenceError: x is not defined
2. 禁止使用with语句
严格模式禁止使用with
语句,因为with
会创建自己的作用域,可能导致变量解析的混乱。
"use strict";
with (obj) { // SyntaxError: Strict mode code may not include a with statement
// ...
}
3. 更严格的赋值错误检查
在严格模式下,对只读属性的赋值、对不可扩展对象的属性赋值、以及对不存在的对象属性赋值会抛出错误。
"use strict";
var obj = {};
Object.defineProperty(obj, "x", { value: 0, writable: false });
obj.x = 3.14; // TypeError: Cannot assign to read only property 'x'
4. 禁止删除不可删除的属性
在严格模式下,尝试删除不可删除的属性会抛出错误。
"use strict";
delete Object.prototype; // TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
5. 禁止重复的参数名称
在严格模式下,函数不能有重名的参数。
"use strict";
function sum(a, a, c) { // SyntaxError: Duplicate parameter name not allowed in this context
return a + a + c;
}
6. 禁止八进制字面量
严格模式下,不允许使用八进制字面量(以0开头的数字)。
"use strict";
var num = 023; // SyntaxError: Octal literals are not allowed in strict mode.
7. this
的值不会被强制转换为对象
在非严格模式下,函数中的this
值如果不是对象,会被自动转换为对象。在严格模式下,this
会保持原有的值。
"use strict";
function whatIsThis() {
return this;
}
whatIsThis(); // undefined
8. 禁止arguments
对象的某些特性
在严格模式下,arguments
对象不再追踪参数的变化,也不能对arguments
对象的属性进行赋值。
"use strict";
function modifyArguments() {
arguments[0] = 99; // 不会改变传入的参数
return arguments[0];
}
modifyArguments(1); // 99
9. 更严格的eval
和arguments
使用
在严格模式下,eval
和arguments
被当作关键字,不能被用作变量或函数名。
"use strict";
var eval = 17; // SyntaxError: Unexpected eval or arguments in strict mode
var arguments = []; // SyntaxError: Unexpected eval or arguments in strict mode
10. 更安全的错误检查
严格模式会捕获一些常见的编码错误,如对只读属性赋值、删除不可删除的属性、引用不存在的变量等。
11. 禁止this
关键字指向全局对象
在严格模式下,如果你在一个函数内部使用this
,而该函数未被任何对象调用,this
的值不会指向全局对象(在浏览器中是window
),而是undefined
。
"use strict";
function myFunction() {
return this; // 这里的this是undefined
}
12. 禁止删除声明的变量
在严格模式下,尝试删除一个使用var
、let
、const
或函数声明的变量会导致语法错误。
"use strict";
var myVar = "test";
delete myVar; // SyntaxError
13. 更严格的函数调用
在严格模式下,函数的caller
和arguments
属性是不可访问的,尝试访问这些属性会抛出类型错误。
"use strict";
function myFunction() {
console.log(myFunction.caller); // TypeError
console.log(myFunction.arguments); // TypeError
}
14. 禁止在非函数代码块中声明函数
在严格模式下,你不能在非函数的代码块(如if
、while
、for
等)内声明函数。这样的做法在非严格模式下可能会导致不可预测的结果。
"use strict";
if (true) {
function f() {} // SyntaxError
}
15. 变量、函数和参数的唯一性
在严格模式下,对象字面量不能有重复的属性名,函数不能有重复的参数名。
"use strict";
var object = { a: 1, a: 2 }; // SyntaxError
function sum(a, b, a) { // SyntaxError
// ...
}
16. 禁止某些保留字
严格模式增加了一些保留字,这些词不能用作变量名或函数名。这些保留字包括implements
、interface
、let
、package
、private
、protected
、public
、static
和yield
。
结论
严格模式通过这些规则增强了错误检查,防止了某些不安全的操作,并使得JavaScript代码更加规范和易于维护。它是现代JavaScript开发中推荐的做法,特别是在ES6及以后的版本中。
如果通过 type="module"
的 script
标签引用 JavaScript 代码时,引入的代码默认开启严格模式。
<script src="./src/index.js" type="module"></script>