在一个非严格模式范围,当变量不与被初始化分配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