在javascript中,嚴格模式是一個非常有用的特性,它可以讓我們避免一些難以調試的低級錯誤,提高程序的可靠性和穩定性。
嚴格模式最大的特點就是限制了一些javascript的靈活性,讓它更嚴謹。例如,在嚴格模式下,我們必須明確地聲明變量,不能隱式地定義一個全局變量。來看下面的例子:
// 非嚴格模式下 function foo() { var x = 1; y = 2; // 變量y未經過定義直接賦值,會自動創建一個全局變量 } foo(); console.log(x); // 輸出1 console.log(y); // 輸出2 // 嚴格模式下 function bar() { 'use strict'; var x = 1; y = 2; // 拋出ReferenceError異常,因為y未定義 } bar(); console.log(x); // 拋出ReferenceError異常,因為x不是全局變量 console.log(y); // 拋出ReferenceError異常,因為y也不是全局變量
需要注意的是,在函數中聲明全局變量其實并不是一件好事,因為它會污染全局命名空間,容易產生命名沖突和意外覆蓋。所以使用嚴格模式可以更好地保護全局命名空間。
除了變量的定義機制,嚴格模式還對函數中的this有了更加嚴格的規則。在非嚴格模式下,函數在執行時如果沒有指定對象作為它的上下文,那么函數內部的this默認指向全局對象(即window)。這在某些場合下是非常危險的,因為我們可能會意外地修改全局對象的屬性。在嚴格模式下,函數內部的this不再默認指向全局對象,而是保持undefined。例如:
// 非嚴格模式下 function foo() { console.log(this); // 輸出全局對象window } foo(); // 嚴格模式下 function bar() { 'use strict'; console.log(this); // 輸出undefined } bar();
另外一個嚴格模式的改動是禁止使用八進制數字字面量。在javascript中,我們可以使用前導0表示一個八進制數字。例如:
console.log(010); // 輸出8
但是,有時候我們會因為不小心加了一個前導0導致出現一些迷惑的問題。在嚴格模式下,這種做法就會被嚴格限制:
'use strict'; console.log(010); // 拋出SyntaxError異常
其他還有許多細節方面的改動,這里就不一一列舉了。總之,使用嚴格模式可以讓我們更加清晰地控制代碼的行為,減少一些潛在的錯誤和風險。我們可以通過在文件頭部添加 'use strict'; 來啟用該模式,也可以在函數內部添加。強烈建議在編寫javascript代碼時使用嚴格模式,讓我們寫出更加嚴謹的代碼。