Hoisting是指什麼呢?
一般來說程式語言都是逐行執行的,所以正常都應該先宣告變數或函式才可以使用。但寫過js的人都會發現有件神奇的事,我們可以先執行函式或變數,然後才進行宣告。
一般的解釋是js會執行類似"提升"的動作,自動將宣告或賦值的步驟在呼叫的時候執行。
但其實Hoisting這個字多少要負些責任讓大家誤會大了。
Hoisting中文叫做提升,我們先把中文的名字忘一邊。
舉例來說我們熟知的使用方式應該是
var a = 'Hello World!';
function b() {
console.log('Called b!');
}
b();
console.log(a);
結果Called b!
Hello World!
到這裡沒有太大的問題那如果按照Hoisting的說法,下面的程式執行應該會產出什麼呢?
b();
console.log(a);
var a = 'Hello World!';
function b() {
console.log('Called b!');
}
答案是Called b!
undefined
照Hoisting說法應該都會自動"提升",怎麼會找不到值呢?原來這跟js如何初始執行環境有關
js在初始的context第一個步驟,就配置給函式還有變數一個記憶體空間。函式在配置時就會完整放在記憶體空間裡,而變數就只是宣告但尚未賦值。
所以回頭來看,用上面的話來解釋的話,在js初始階段,程式碼應該會被解讀成…
var b = function () {
console.log('Called b!');
};
var a;
b();
console.log(a);
a = 'Hello World!';
來看看學到的Hoisting定義
Setup Memory Space for Variable and Functions called Hoisting
因為js在初始時,會先建立所有變數與函數的記憶體空間,接下來才逐步執行。所以才會發生function可以執行,a尚未賦值值只有初始值undefined。
簡單結論
- 變數必須宣告在文件的最上方
- 記得沒事乖乖按原本的方式
- 不要濫用Hoisting的特性免得debug會想哭
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言