前言

JavaScript的嚴格模式,如其名會讓程式碼的檢視變的嚴格,嚴格意味著不讓你錯,寫起來會更加安全嚴謹。

今天會照以下幾個角度來講解:

  • 嚴格模式由來
  • 使用方式
  • 禁止事項
  • 使用情境

嚴格模式由來

JavaScript寫法規則相對來說不嚴謹,像是弱型別的轉換特性,就算沒有寫清楚,JavaScript也會自動幫忙補完,不會報錯,好處是很容易上手,不會被一大堆語法的限制給綁手綁腳,不過同時壞處也是十分明顯的,有時候寫錯也不會報錯,那麼將會很難避免一堆潛在錯誤,在寫的時候也完全發現不了。

為了應付這種狀況,JavaScript在 2009 年 ECMAScript5 有新推出了這個叫做Strict Mode的語法,創造出一個模式,是很嚴格嚴謹的,提供一個給開發者改善上述提到不嚴謹導致出錯的問題,讓開發者可以自由選擇。

舉例來說,在嚴格模式下,沒有辦法使用一個沒有宣告的變數。

沒有嚴格模式:

1
2
apple = 10;
console.log(apple); //10

使用了嚴格模式:

1
2
3
"use strict";
apple = 10;
console.log(apple); //ReferenceError

接下來介紹在JavaScript要如何使用。

使用方式

要讓程式知道是嚴格模式的話,首先要加上這段指令:
"use strict";

假如說是放在程式碼的最前面,會使整個JavaScript的檔案都變成了嚴格模式。

而也可以只放在函式裡面,那麼就只有函式會生效。

1
2
3
4
5
6
7
8
function A() {
"use strict";
// apple = 10;
// console.log(apple);
}
// A();
apple = 10;
console.log(apple);

函式外面的範圍就不會被嚴格模式給影響到,所以可以理解成嚴格模式有分成兩種的作用域。

一種是Global Scope,在程式的開頭宣告,那麼它將會有全局的範圍都會變成是嚴格模式。

另一種是Function Scope

在函式的開頭宣告,那它只會存在於函式的{}裡面是嚴格模式。

另外假如不是在開頭宣告,那在宣告了"use strict";之上的所有程式碼,都不會被嚴格模式影響到。

所以假如要使用嚴格模式的話,很重要的一點是確保"use strict";出現在最頂部,不論是Global Scope或是Function Scope

還有一個使用上要注意的小地方是,當使用"use strict";之後,就沒辦法取消,沒有指令可以再返回沒有"use strict";的狀態,所以假如用了嚴格模式後,不想要使用了,就只能在當初寫的"use strict";給刪除或是註解掉。

禁止事項

除了上面有提到過的沒宣告的變數沒辦法使用之外,如果變成了嚴格模式將會有這些限制:

  • 不能使用 delete 刪除變數或是函式

刪變數 =>

1
2
3
"use strict";
let apple = 10;
delete apple; // SyntaxError

刪函式 =>

1
2
3
4
5
"use strict";
function apple() {
return 10;
}
delete apple; // SyntaxError
  • 不能重複參數名稱
1
2
"use strict";
function apple(A, A) {} //SyntaxError
  • 不能使用八進制數字
1
2
"use strict";
const apple = 010; //SyntaxError
  • 不能使用evalarguments當變數名稱
1
2
3
"use strict";
const eval = 10; // SyntaxError
const arguments = 10; // SyntaxError
  • 不能使用with
1
2
3
4
"use strict";
with (Math) {
x = cos(2);
} // SyntaxError
  • 以下的關鍵字為了將來版本的保留,所以在嚴格模式下也通通不能拿來當變數名稱:
    implements、interface、let、package、private、protected、public、static、yield

  • 嚴格模式時,this 的預設狀態都會指向undefined

瀏覽器環境 node.js 環境
嚴格模式 undefined undefined
非嚴格模式 window global

使用情境

什麼時候會用到,該不該去使用嚴格模式,我的看法是要是一個專案或者是程式碼已經很龐大了,也許可以先從Function Scope的方式去使用嚴格模式,因為假如在一個專案中直接改成嚴格模式的話,可能會直接無法運作且一時之前有點難改完。

而在寫程式的一開始就直接使用嚴格模式就不會有這個問題,而且也會幫助養成好習慣,寫出來的程式碼也會好維護,而有些新的結構其實就內建了嚴格模式,像是之前有講到過的class,以及module,使用它們的時候沒有設定嚴格模式也會有嚴格模式的效果。

關於嚴格模式的介紹就到這邊,各位明天見。

reference

[1] MDN - Strict Mode
[2] W3C - JavaScript Use Strict