更新時間:2021年11月03日10時39分 來源:傳智教育 瀏覽次數(shù):
簡單說就是在JavaScript代碼執(zhí)行前引擎會先進(jìn)行預(yù)編譯,預(yù)編譯期間會將變量聲明與函數(shù)聲明提升至其對應(yīng)作用域的最頂端,函數(shù)內(nèi)聲明的變量只會提升至該函數(shù)作用域最頂層,當(dāng)函數(shù)內(nèi)部定義的一個變量與外部相同時,那么函數(shù)體內(nèi)的這個變量就會被上升到最頂端。
舉例來說:
console.log(a); //undefined var a = 3;
//預(yù)編譯后的代碼結(jié)構(gòu)可以看做如下運(yùn)行順序 var a; // 將變量a的聲明提升至最頂端,賦值邏輯不提升。 console.log(a); // undefined a = 3; // 代碼執(zhí)行到原位置即執(zhí)行原賦值邏輯
·函數(shù)提升只會提升函數(shù)聲明式寫法
·函數(shù)表達(dá)式的寫法不存在函數(shù)提升
·函數(shù)提升的優(yōu)先級大于變量提升的優(yōu)先級,即函數(shù)提升在變量提升之上
下面我們來看一道題。
以下代碼執(zhí)行后,控制臺的輸出是:
var a = 10; function a(){} console.log(typeof a)
A、“number”
B、“object”
C、“function”
D、“undefined”
正確答案:A
解題思路:
函數(shù)提升大于變量提升,變量提升會提升到除函數(shù)聲明的后面;變量提升,但是賦值不提升、函數(shù)表達(dá)式亦是如此,所以應(yīng)該是下面的步驟
function a(){} var a; a=10; //如果沒有這一步賦值操作的話,類型還是function console.log(typeof a); //a=10 number
猜你喜歡