全域性屬性的更改

在非嚴格模式範圍內,如果在未使用 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