今天我們將講解JavaScript Hoisting以及TDZ(暫時性死區),
什麼是Hoisting呢?
中文意思:抬起,吊起
在JavaScript中,Hoisting指的是一種執行程式碼前,將declaration移動到最上方的行為
那在JavaScript中主要有兩種declaration
讓我們看以下Function declartion例子:
Name(); // Jeremy
function Name(){
console.log('Jeremy')
}
在上述例子中,由於JavaScript引擎的Hoisting行為,使得Name函式在尚未定義前,即可使用
接下來看Variable declaration例子:
在舉例前,必須先講解Variable declaration的兩種階段:
Declaration phase(宣告階段)以及Initialization phase(初始化階段)
Declaration phase:變數會被宣告,而Hoisting也只提昇『宣告』
Initialization phase: 變數賦值
此外對於var, const以及let,Hoisting也會有不同作法
console.log(x);
var x = 5; //undefined
為什麼結果會是undefined呢?
因為hoisting只提昇了var x,並給定一個undefined作為初始值
console.log(y);
let y = 5 // Uncaught ReferenceError: Cannot access 'y' before initialization
根據上方解釋我們可以得知,其實let和const是有hoisting的,那為何會跳出這樣的Error message呢?
定義:對於使用 let 或 const 宣告的變量,在進入Initialization phase(初始化階段)之前,無法存取或引用它們的值
由於TDZ的設定,才會得到初始化前無法讀取的Error message
TDZ能為有助於避免使用未初始化的變數,這也是為何會不建議使用var來宣告變數!