JavaScript
的嚴格模式,如其名會讓程式碼的檢視變的嚴格,嚴格意味著不讓你錯,寫起來會更加安全嚴謹。
今天會照以下幾個角度來講解:
JavaScript
寫法規則相對來說不嚴謹,像是弱型別的轉換特性,就算沒有寫清楚,JavaScript
也會自動幫忙補完,不會報錯,好處是很容易上手,不會被一大堆語法的限制給綁手綁腳,不過同時壞處也是十分明顯的,有時候寫錯也不會報錯,那麼將會很難避免一堆潛在錯誤,在寫的時候也完全發現不了。
為了應付這種狀況,JavaScript
在2009年ECMAScript5有新推出了這個叫做Strict Mode
的語法,創造出一個模式,是很嚴格嚴謹的,提供一個給開發者改善上述提到不嚴謹導致出錯的問題,讓開發者可以自由選擇。
舉例來說,在嚴格模式下,沒有辦法使用一個沒有宣告的變數。
沒有嚴格模式:
apple = 10;
console.log(apple); //10
使用了嚴格模式:
"use strict";
apple = 10;
console.log(apple); //ReferenceError
接下來介紹在JavaScript
要如何使用。
要讓程式知道是嚴格模式的話,首先要加上這段指令:"use strict";
假如說是放在程式碼的最前面,會使整個JavaScript
的檔案都變成了嚴格模式。
而也可以只放在函式裡面,那麼就只有函式會生效。
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";
給刪除或是註解掉。
除了上面有提到過的沒宣告的變數沒辦法使用之外,如果變成了嚴格模式將會有這些限制:
刪變數 =>
"use strict";
let apple = 10;
delete apple; // SyntaxError
刪函式 =>
"use strict";
function apple() {
return 10;
}
delete apple; // SyntaxError
"use strict";
function apple(A, A) {} //SyntaxError
"use strict";
const apple = 010; //SyntaxError
eval
跟arguments
當變數名稱"use strict";
const eval = 10; // SyntaxError
const arguments = 10; // SyntaxError
with
"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
,使用它們的時候沒有設定嚴格模式也會有嚴格模式的效果。
關於嚴格模式的介紹就到這邊,各位明天見。
[1] MDN - Strict Mode
[2] W3C - JavaScript Use Strict