全局属性的更改

在非严格模式范围内,如果在未使用 varconstlet 关键字初始化的情况下分配变量,则会在全局范围内自动声明该变量:

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