---
# System prepended metadata

title: 嚴格模式 "use strict"

---

# 嚴格模式 "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