JavaScript 全局属性的变化

示例

在一个非严格模式范围,当变量不与被初始化分配var,const或let关键字,则自动在全局范围内宣称:

a = 12;
console.log(a); // 12

但是,在严格模式下,对未声明变量的任何访问都将引发引用错误:

"use strict";
a = 12; // ReferenceError:未定义
console.log(a);

这很有用,因为JavaScript有许多可能的事件,这些事件有时是意外的。在非严格模式下,这些事件通常使开发人员认为它们是错误或意外行为,因此,通过启用严格模式,抛出的任何错误都将迫使他们确切地知道正在执行的操作。


"use strict";
                       // 假设存在全局变量mistypedVariable
mistypedVaraible = 17; // 这行由于 
                       // 变量拼写错误

严格模式下的这段代码显示了一种可能的情况:它引发一个引用错误,该错误指向分配的行号,从而使开发人员可以立即检测到变量名称中的错误类型。

在非严格模式下,除了不会引发任何错误并且已成功进行分配之外,mistypedVaraible还将在全局范围内自动将其声明为全局变量。这意味着开发人员需要在代码中手动查找此特定任务。


此外,通过强制声明变量,开发人员不会在函数内部意外声明全局变量。在非严格模式下:

function foo() { 
   a = "bar"; // 变量在全局范围内自动声明
}
foo();
console.log(a); // >> bar

在严格模式下,必须显式声明变量:

function strict_scope() { 
   "use strict";
   var a = "bar"; // 变量是局部的
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"

变量也可以在函数外部和之后声明,从而允许在例如全局范围内使用它:

function strict_scope() { 
   "use strict";
   a = "bar"; // 变量是全局的
}
var a;
strict_scope();
console.log(a); // >> bar