全局属性的更改
在非严格模式范围内,如果在未使用 var
,const
或 let
关键字初始化的情况下分配变量,则会在全局范围内自动声明该变量:
a = 12;
console.log(a); // 12
但是,在严格模式下,对未声明变量的任何访问都会引发引用错误:
"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);
这很有用,因为 JavaScript 有许多可能意外的事件。在非严格模式下,这些事件通常会导致开发人员认为它们是错误或意外行为,因此通过启用严格模式,抛出的任何错误都会强制它们确切知道正在执行的操作。
"use strict";
// Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the
// misspelling of variable
严格模式下的此代码显示一种可能的情况:它抛出一个指向赋值行号的引用错误,允许开发人员立即检测变量名称中的错误类型。
在非严格模式下,除了没有抛出错误并且成功完成赋值之外,mistypedVaraible
将在全局范围内自动声明为全局变量。这意味着开发人员需要在代码中手动查找此特定分配。
此外,通过强制声明变量,开发人员不会在函数内意外声明全局变量。在非严格模式下:
function foo() {
a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar
在严格模式下,有必要显式声明变量:
function strict_scope() {
"use strict";
var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"
变量也可以在函数外部和函数之后声明,允许它在全局范围内使用:
function strict_scope() {
"use strict";
a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar