[JavaScript] Javascript 的嚴格模式 (Strict Mode):不讓你錯

itsems
itsems_frontend
Published in
Oct 25, 2020
Photo by NeONBRAND on Unsplash
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

--

--

itsems
itsems_frontend

Stay Close to Anything that Makes You Glad You are Alive.