全域性屬性的更改
在非嚴格模式範圍內,如果在未使用 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