JavaScript是一個寫起來很語法很寬鬆的程式語言,但是過度的寬鬆可能會導致最後出現Bug,在開發中沒有報錯,最後debug上會是比較困擾的,因為在寫程式碼的時候不會發現,然而在ES5新支援了「嚴格模式(Strict mode)」來改善,只要在程式碼中使用了"use strict"
,JavaScript就會引用嚴格模式來看待你的程式碼
在JS檔案中加入"use strict"
字串,即會套用嚴格模式
在檔案的開頭套用"use strict"
,這份檔案將會全部引用嚴格模式,須注意如果不是在最前面加上,嚴格模式將會無效
範例:未定義的變數不能賦值
(use strict
加在最前面)
"use strict"
a = "AL"
console.log(a) // 錯誤 ReferenceError: a is not defined
(use strict
沒有加在最前面)
b = "Banana"
"use strict"
console.log(b) // 輸出 "Banana"
套用在函式中的開頭,嚴謹模式「僅會在該函式作用」
如果套用在函式中非開頭的地方,嚴謹模式將會無效
(use strict
加在函式的開頭,只有這個函式套用)
(function () {
'use strict';
j = 'doooooog'; // 錯誤 ReferenceError: j is not defined
})();
整理以上的兩種用法可以得知「嚴格模式」的作用範圍有兩種
"use strict"
d = "hot dooooog" // 錯誤 ReferenceError: d is not defined
'use strict'
function a(user, user) { console.log('hello world');}
// 錯誤 SyntaxError: Duplicate parameter name not allowed in this context
'use strict';
var x = 42;
delete x; // 錯誤 SyntaxError: Delete of an unqualified identifier in strict mode
這個規則適用在"直接刪除"變數、函數或參數
如果要在嚴格模式下直接刪除物件內的屬性,通常是可以的
"use strict"
let a = {
food: "apple"
}
delete a.food
// true
console.log(a) // 輸出 {}
在嚴格模式下,this的值是undefined
"use strict"
function checkThis(){
console.log(this)
}
checkThis() // 輸出 undefined
非嚴格模式下的this值會是全域Window物件
function checkThis(){
console.log(this)
}
checkThis() // 輸出 Window 物件
'use strict'
var x = 023 // 錯誤 SyntaxError: Octal literals are not allowed in strict mode
"use strict"
let eval = "AL"
let arguments = "Apple"
// 錯誤 SyntaxError: Unexpected eval or arguments in strict mode
補充:ES6新增的保留字在(嚴格/非嚴格)模式下都不能被當作變數名稱
implements, interface, let, package, private, protected, public, static, yield
在嚴格模式的情境下,會將不適當的語法從默默被接受,改為「拋出錯誤」,在開發過程中如過能即時知道哪邊拋出了錯誤,則可以即時進行debug診斷。
視情況,如果接手的專案是非常成熟的專案且持續維護,當時並不是用嚴格模式開發,如果將專案轉為嚴格模式,很可能會與一般模式語法有很多的差異,而讓舊專案跑不動,但如果是新的專案建置,選擇用嚴格模式開發會是一個好的建議選項。
參考文章
[JavaScript] Javascript 的嚴格模式 (Strict Mode):不讓你錯
你不可不知的 JavaScript 二三事#Day11:Strict Mode (嚴謹模式)
鐵人賽:JavaScript 的嚴格模式 "use strict"