Andy的前後端技術筆記、生活紀錄
Javascript 的 hoisting關於var,let,const and function
發佈於: 2024-04-17 更新於: 2024-04-21 分類於: frontend > frontend_interview

什麼是Hoisting(提升)

當js在編譯時會把變數宣告以及函式宣告提升到該作用域的最頂端,但實際上不會去改動程式碼,有時候在撰寫程式碼時有沒有發現雖然你的function宣告在後面,卻在前面使用function而不會跳錯,就是這個原因

變數 var, let, const

在var宣告變數及使用變數時如果寫成以下狀況,變數a會被提升,在這情況a雖然可以被印出,但不會被賦值,所以會印出undefined。

1
2
3
4
5
function exampleFunction() {
console.log(a); // undefined
var a = 5;
}
exampleFunction();

let, const,若是這樣寫則是會跳出錯誤,Uncaught ReferenceError: Cannot access 'a' before initialization,告訴你在尚未初始化前不能使用該變數,該變數會是在暫時死區 (temporal dead zone)直到該變數被宣告為止。

1
2
3
4
5
function exampleFunction() {
console.log(a);
let a = 5;
}
exampleFunction();

Function提升

這裡要分Declaration ,Expressions, Arrow Functions 三種
在提升的部分,只有Declaration Function 才會被提升,Expressions Function 和 Arrow Function 都不會被提升,所以哪天在寫程式時發現寫在後面的function無法被前面程式碼使用,通常就是這原因,在js編譯時沒有把它提升上來。

Declaration Function 如下:

1
2
3
4
5
6
7
exampleFunction()

function exampleFunction() {
let a = 5;
console.log(a);

}

Expressions Function 如下:

1
2
3
4
5
6
exampleFunction()

const exampleFunction = function() {
let a = 5;
console.log(a);
}

Arrow Function 如下:

1
2
3
4
5
6
exampleFunction()

const exampleFunction = () => {
let a = 5;
console.log(a);
}
--- 到底拉 The End ---