iT邦幫忙

2023 iThome 鐵人賽

DAY 18
1
Modern Web

那些你可能要知道的前端知識系列 第 18

【day18】JavaScript の 嚴格模式(Strict mode)

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230921/20148303msZUBFmG9n.png


嚴格模式(Strict mode)是什麼?為什麼會出現?

JavaScript是一個寫起來很語法很寬鬆的程式語言,但是過度的寬鬆可能會導致最後出現Bug,在開發中沒有報錯,最後debug上會是比較困擾的,因為在寫程式碼的時候不會發現,然而在ES5新支援了「嚴格模式(Strict mode)」來改善,只要在程式碼中使用了"use strict",JavaScript就會引用嚴格模式來看待你的程式碼

嚴格模式怎麼使用

在JS檔案中加入"use strict"字串,即會套用嚴格模式

1. 檔案開頭套用嚴格模式

在檔案的開頭套用"use strict",這份檔案將會全部引用嚴格模式,須注意如果不是在最前面加上,嚴格模式將會無效

範例:未定義的變數不能賦值
(use strict 加在最前面)

"use strict"
a = "AL"
console.log(a) // 錯誤 ReferenceError: a is not defined

(use strict 沒有加在最前面)

b = "Banana"
"use strict"
console.log(b) // 輸出 "Banana"

2. 套用在函式裡面的開頭

套用在函式中的開頭,嚴謹模式「僅會在該函式作用
如果套用在函式中開頭的地方,嚴謹模式將會無效

(use strict加在函式的開頭,只有這個函式套用)

(function () {
  'use strict';
  j = 'doooooog'; // 錯誤 ReferenceError: j is not defined
  
})();

整理以上的兩種用法可以得知「嚴格模式」的作用範圍有兩種

  • 宣告在檔案最上方:所有程式將會套用嚴格模式
  • 宣告在函式開頭:只有該函式會套用嚴格模式

嚴格模式做了哪些規範

1.未宣告的變數不能賦值

"use strict"
d = "hot dooooog" // 錯誤 ReferenceError: d is not defined

2.參數名稱重複

'use strict'
function a(user, user) { console.log('hello world');}
// 錯誤 SyntaxError: Duplicate parameter name not allowed in this context

3.刪除已經宣告的變數、函數、參數

'use strict';

var x = 42;

delete x; // 錯誤 SyntaxError: Delete of an unqualified identifier in strict mode

這個規則適用在"直接刪除"變數、函數或參數
如果要在嚴格模式下直接刪除物件內的屬性,通常是可以的

"use strict"
let a = {
    food: "apple"
}

delete a.food
// true

console.log(a) // 輸出 {} 

4.this 在嚴格模式下會是 undefined

在嚴格模式下,this的值是undefined

"use strict"

function checkThis(){
    console.log(this)
}

checkThis() // 輸出 undefined

非嚴格模式下的this值會是全域Window物件

function checkThis(){
    console.log(this)
}

checkThis() // 輸出 Window 物件

5.禁止用八進位值

'use strict'

var x = 023 // 錯誤 SyntaxError: Octal literals are not allowed in strict mode

6.arguments、eval 不能是變數名稱

"use strict"

let eval = "AL"
let arguments = "Apple"
// 錯誤 SyntaxError: Unexpected eval or arguments in strict mode

補充:ES6新增的保留字在(嚴格/非嚴格)模式下都不能被當作變數名稱
implements, interface, let, package, private, protected, public, static, yield


為什麼要使用嚴格模式

在嚴格模式的情境下,會將不適當的語法從默默被接受,改為「拋出錯誤」,在開發過程中如過能即時知道哪邊拋出了錯誤,則可以即時進行debug診斷。

一定要用嚴格模式開發嗎

視情況,如果接手的專案是非常成熟的專案且持續維護,當時並不是用嚴格模式開發,如果將專案轉為嚴格模式,很可能會與一般模式語法有很多的差異,而讓舊專案跑不動,但如果是新的專案建置,選擇用嚴格模式開發會是一個好的建議選項。


參考文章
[JavaScript] Javascript 的嚴格模式 (Strict Mode):不讓你錯
你不可不知的 JavaScript 二三事#Day11:Strict Mode (嚴謹模式)
鐵人賽:JavaScript 的嚴格模式 "use strict"


上一篇
【day17】JavaScript "this"
下一篇
【day19】React Hook 是什麼
系列文
那些你可能要知道的前端知識30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言