JS 額外補充:hoisting 變數提升(二)

Hugh's Programming life
2 min readJun 5, 2019

這篇是接續這篇內容的建議先參考該篇在來看這篇:JS 額外補充 hoisting 變數提升

Hoisting

變數(宣告)提升

function test() { 
console.log(a);
var a = 10;
}
// undefined

最簡單的就是上述的範例會等於

function test() {
var a;
console.log(a);
a = 10;
}
// undefined

變數提升最重要的目的:可以在宣告 function 之前就使用到該 function,後來就演變成變數也可以提升

function test() {
let a = 1;
function test2() {
console.log(a)
}
test2();
}
test();
// 1

以這樣來說,他找不到 a 就會出去上層找 a 所以得到答案 1

-

如果改為

function test() {
let a = 1;
function test2() {
console.log(a)
var a = 10;
}
test2();
}
test();
// undefined

會這樣是因為 var a 也會變數提升,所以等於重新定義了一次,所以印出來就是 undefined

前面說 let 不會變數提升,所以把這題改成 let

function test() {
let a = 1;
function test2() {
console.log(a)
let a = 10;
}
test2();
}
test();
// a is not defined

如果沒有變數提升不應該是往上找嗎?

這個現象說明 let 還是有變數提升的,但是方式跟 var 不一樣

var 的話 變數會被初始化為 undefined

let 的話 在給值之前去存取的話,會出現 ReferenceError: is not defined ,有個名稱叫做 Temporal Dead Zone,這邊的意思是,從變數提升的位置到實際賦值的位置,都稱作為 Temporal Dead Zone, TDZ. 補充資料

所以如果中間有任何的程式碼都被視為 TDZ

所以在 TDZ 的區塊內要用到那個變數,就會跳出 ReferenceError: a is not defined 的錯誤

這些資料其實不一定要非常明白,只需要記得第一個例子所表示的,當成補充資料來了解即可。

--

--

Hugh's Programming life

我是前端兼後端工程師,主要在前端開發,包括 React、Node.js 以及相關的框架和技術。之前曾擔任化工工程師的職位,然而對電腦科技一直抱有濃厚的熱情。後來,我參加了轉職課程並開設這個部落格紀錄我的學習過程。於2020年轉職成功後,我一直持續精進技能、擴展技術範疇跟各種對人生有正面意義的學習,以增加我的工作能力。