Day 12:看 Strict Mode 如何施展「還我漂亮拳」(1)
Day11 的文章介紹 JavaScript 中的嚴謹模式 (Strict Mode) 是什麼、如何使用、為什麼要用,並舉了簡單的例子來示範。
嚴謹模式 (Strict Mode) 就像 JavaScript 中的「還我漂亮拳」,能夠讓原本不夠嚴謹、造成混亂的語法,變得更安全、乾淨。
(Source: 網路)
「不允許使用未宣告的變數」只是嚴謹模式最簡單的應用,事實上嚴謹模式發揮的地方非常多。
接下來會用各種例子來檢視嚴謹模式使用前和使用後的效果。
嚴謹模式下你不能做的事
1. 不能使用未宣告的變數
強化變數的控管,快速發現打錯變數名稱的 Bug。
避免不小心產生不必要的 Global 變數 (賦值給尚未宣告的變數,JavaScript 預設行為會產生 Global 變數)。
錯誤類型:
ReferenceError: x is not defined
使用前:
x = 3.14;
console.log(x); // 3.14使用後:
"use strict";
x = 3.14; // ReferenceError: x is not defined
console.log(x);2. 不能刪除變數或函數
不能對變數或函數使用
delete運算子 (原本對變數或函數作刪除並不會有效果,但也不會拋錯,等於無用的廢 code)但還是可以對物件屬性或陣列元素使用。
錯誤類型:
SyntaxError: Delete of an unqualified identifier in strict mode
使用前:
使用後:
3. 函數的參數名稱不能重複
一般模式下,函數的參數名稱如果不慎重複,不會有提醒。
錯誤類型:
SyntaxError: Duplicate parameter name not allowed in this context
使用前:
使用後:
4. 不能使用八進制的數字實字 (Octal numeric literals)
某些版本的 JavaScript 中,如果數字前頭帶
0,會被直譯為八進制。例如:
var x = 010;等於十進制的8。一般 JavaScript 實作規範中就強烈建議不要對數字開頭帶
0(但一般模式下仍可被 JavaScript 直譯器接受)。嚴謹模式會直接對這樣的語法拋錯。
錯誤類型:
SyntaxError: Octal literals are not allowed in strict mode
使用前:
使用後:
5. 不能使用八進制的跳脫字元 (Octal escape characters)
例如:
var x = "\010";。
註:我個人沒用過這個用法,實際上印出來也只看得到空字串,不知道可以應用在哪。
錯誤類型:
SyntaxError: Delete of an unqualified identifier in strict mode.
使用前:
使用後:
6. 不能對唯讀的物件屬性作寫入 (write to a read-only property of objects)
在定義物件屬性時,可以設定是否可寫入 (writable)。
一般模式下,如果對
writable:false的屬性作賦值動作,不會寫入成功,但也不會報錯 (等於廢 code)。嚴謹模式下會直接拋錯。
錯誤類型:
TypeError: Cannot assign to read only property 'articleTarget' of object '#<Object>'
使用前:
使用後:
7. 不能對 get-only 的物件屬性作寫入
一般模式下,如果對只有 getter 的屬性作賦值動作,不會寫入成功,但也不會報錯 (等於廢 code)。
嚴謹模式下會直接拋錯。
錯誤類型:
TypeError: Cannot set property age of #<Object> which has only a getter
使用前:
使用後:
References
Last updated
Was this helpful?