[JavaScript] Javascript 的嚴格模式 (Strict Mode):不讓你錯
Outlines:
+ 嚴格模式是什麼? 為什麼要用? (What is Strict Mode? Why should you use it?)
+ 怎麼使用? (How?)
+ 哪些不能寫? (Limits?)
嚴格模式是什麼? 為什麼要用?
Javascript 是一種很自由的語言,但也正因如此,不嚴謹的寫法是被允許的。Strict Mode 是在 ES5 新增的,只要加上了 “use strict”
這段文字,JS 引擎就會用嚴格的標準來讀你的 code,避免你寫出不穩定或不夠嚴謹的 code。
一言以蔽之:讓你的 Javascript 更安全。
怎麼使用?
一、整支檔案使用:加在 JS 檔案最前面
直接加在 JS 的最前面就可以,這樣表示整支 JS 都會以嚴格模式執行。
'use strict'
var myName;
需要注意不是加在最前面就無效,並如果你在 JS 檔案中引入了很多支別的 JS,第一支 JS 的第一行加上了 ‘use strict’
了的話,後面所有 JS 檔案都會以嚴格模式執行。
二、指定函式使用:加在函式的第一行
如果加在函式裡的第一行,就只有這個函式套用了嚴格模式
function myName(){
'use strict'
var iAm = 'Emma';
}
哪些不能寫?
如果你決定要開始使用嚴格模式,以下幾種是不被允許的狀況:
- 直接定義未宣告變數:
'use strict'
myName = 'Emma';
- 使用 delete 刪除變數或函式
'use strict'
var x = 'x';
delete x;function a() { console.log('hi'); }
delete a;
- 重複變數
'use strict'
function a(b, b) { console.log('hi');}
- 使用 8 進位值
"use strict";
var x = 010;
var x = '\010';
- 使用 with
"use strict";
with (Math){x = cos(2)};
- eval、arguments 不能當作變數名稱
"use strict";
var eval = 3.14;
var arguments = 3.14;
- 接下來這幾種保留字為了日後的 ES6 ,也不能當作變數名稱:
implements、interface、let、package、private、protected、public、static、yield - 「this」禁止指向全域
若沒有使用 strict mode,以下這個 code block 會印出 window 這個全域環境,若啟用了嚴格模式,則會返回 undefined
"use strict";
function hi() {
console.log(this); }
hi(); // undefined
結論
所以,到底該不該用嚴格模式?
這樣的問題沒有標準答案,以我自身的看法,如果你是接手一個已經十分成熟、且長期維護的系統,突然整套使用嚴格模式可能不是一個好的作法,他極有可能讓你的專案直接無法運作。但是如果今天你正從頭開始建置你的專案,那麼嚴格模式是你可以考慮的,但是需要注意不是每一個 JS 引擎的嚴格模式都一樣,不同的 JS 引擎在處理嚴格模式上略有不同。
所以你不應該過度依賴他,但是也可以適度的使用他。
內容若有任何錯誤,歡迎留言交流指教!🐖
ref:
JavaScript 全攻略:克服 JS 的奇怪部分
MDN-Strict mode
w3c-JavaScript Use Strict