# 嚴格模式 "use strict" ## 定義: Javascript ES5新增的一個功能,只要加上了 “use strict” 這段文字,JS 引擎就會用嚴格的標準來讀你的 code,避免你寫出不穩定或不夠嚴謹的 code。 <br> **use strict的使用方式為** 1.直接加入在js程式碼檔案的最前面 ``` "use strict"; function tryFunction(){ var tryValue = 123; return tryValue; } ``` 2.單獨使用在 function 下,但必須將 'use strict' 放在函式開頭才會有作用。 ``` // Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code... ``` <br> **開始使用嚴格模式後,不被允許的狀況:** * 直接定義未宣告變數 ``` "use strict"; auntie = '漂亮阿姨'; // Uncaught ReferenceError: auntie is not defined ``` * 使用 delete 刪除變數或函式 ``` 'use strict' var x = 'x'; delete x; function a() { console.log('hi'); } delete a; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. ``` * 重複變數(物件內有重複屬性) ``` 'use strict' function a(b, b) { console.log('hi'); } //Uncaught SyntaxError: Duplicate parameter name not allowed in this context ``` * 使用 8 進位值 ``` "use strict"; var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode. ``` 註解:某些版本的 JavaScript 中,如果數字前頭帶 0,會被直譯為八進位制。 * 使用 with 語法 ``` "use strict"; var a; var r = 10; with (Math) { a = PI * r; } // Uncaught SyntaxError: Strict mode code may not include a with statement ``` * eval、arguments 不能當作變數名稱 ``` "use strict"; var eval = 3.14; var arguments = 3.14; ``` 註解:正常模式下,Javascript語言有兩種變數作用域(scope):全域性作用域和函式作用域。嚴格模式創設了第三種作用域:eval作用域。 * this禁止指向全域 ``` var hasStrictMode = (function () { "use strict"; console.log(this === undefined); //true }()); ``` ## 優缺點: ### 優點- 1. 對於js新手來說,幫助了解並消除Javascript語法的一些不合理、不嚴謹的地方。 2. 消除程式碼執行的一些不安全之處,保證程式碼執行的安全。 3. 提高編譯器效率,增加執行速度。 4. 為未來新版本的Javascript做好鋪墊。 ### 缺點- 1. 從未用過嚴格模式的專案,一但突然開始使用,可能會沒有辦法運作。 2. 現在網站的 JS 都會進行壓縮,一些檔案用了嚴格模式,而另一些沒有。這時這些本來是嚴格模式的檔案,再 merge的時候可能會因為嚴格模式的宣告位置改變了,不僅沒有做到嚴格模式,反而在壓縮後浪費了位元組。 ## 意見搜集: **Niz** > 業界沒有特別要求要用,不用太嚴肅看待這個東西, > 所以其實用一般標準去寫就可以了。如果個人覺得use strict很好用,還是可以用。 > 在業界,比起嚴格模式,eslint可能比較好一點, > 建議如果想加強自己寫程式的方式,除了常看別人寫程式的方式去修正自己,也可以看clean code這本書。 <br> **Jenny** > 平常不會用,以前在AppworkSchool的時候也沒有用的習慣。 > 比起use strict還有react的React.StrictMode,更推薦用eslint比較快, > use strict和eslint擇一用就好。在業界大部分都是導入eslint。 <br> **前端工程師C(資歷:5年)** > 很久以前還在寫js的時候會在工作上用(目前都在寫typescript),js的寫法太自由,預設有提供一些其他語言都不會出現的特性,因此常會導致誤會跟錯誤。use strict 就是限制不使用這些用法,來避免這類錯誤。 > 建議大家平常可以多放一些注意力在自己寫程式的方式及邏輯。因為經驗不足的時候,常常會寫出很爛,難以理解的寫法,看版本控制準備嘴人的時候發現是一個月前的自己寫的,這很常見。 <br> **全端工程師A(資歷:6年)** > 自己本身沒有在用,目前看過的程式跟公司在寫的也沒有在用,感覺用的人蠻少的。 <br> **全端工程師F(資歷:7年)** > 自己本身沒有用的習慣,純粹以前沒嚴格模式也是用的好好的,就不會特別去用。但如果是新人的話,建議可以用,應該可以少走蠻多冤枉路。 > 嚴格模式只是用程式語言層級幫你避開一些 Javascript 常見的地雷,通常JS寫的不錯的人本來就會避開,就不會特別去用嚴格模式。 <br> ## 結論: use strict對新手來說是個不錯的選擇,但比起use strict也可以參考使用eslint會更加符合業界需求。 如果面臨的狀況是接手一個已經十分成熟、且長期維護的系統,突然使用嚴格模式可能會讓專案直接無法運作。但是如果今天你正從頭開始建置你的專案,那麼嚴格模式是可以考慮的。 --- 參考資料: 卡斯柏-JavaScript 的嚴格模式 "use strict" https://wcc723.github.io/javascript/2017/12/15/javascript-use-strict/ React-嚴格模式 https://zh-hant.reactjs.org/docs/strict-mode.html Javascript 的嚴格模式 (Strict Mode):不讓你錯 https://medium.com/itsems-frontend/javascript-strict-mode-d0a3aa74458b