javascript學(xué)習(xí)筆記-函數(shù)聲明提升和變量聲明提升

1.變量提升:

使用var 關(guān)鍵字聲明的變量都存在變量提升,以下代碼中,雖然在沒有聲明變量a之前就調(diào)用了a,但是卻沒有報錯,打印出undefined,是因為用var聲明的變量會存在變量提升

console.log(a);
var  a=10;

根據(jù)變量提升原理,以上等價于

var a;
console.log(a);
a=10;

由以上可以明確看出,變量a被聲明,只是沒有被賦值,所以不會報錯。

2.函數(shù)聲明提升

創(chuàng)建函數(shù)的兩種方式:
函數(shù)表達式方式:

var a =function(){

}
a();

函數(shù)表達式方式其實就是變量聲名的一種,所以以上代碼塊也可這樣寫:
var a;
a=function(){

}
a();

函數(shù)聲明方式:

function a(){

}
a();

當(dāng)使用聲明方式創(chuàng)建一個函數(shù)的時候,存在函數(shù)聲明提升如:

    a();
    function a(){
        alert("你好!");
    }

該代碼塊將彈出 alert,這是因為在函數(shù)被以這種方式創(chuàng)建的時候,函數(shù)聲明提升的原因,函數(shù)在頁面打開時就已經(jīng)被創(chuàng)建好了;

如果使用表達式的方式創(chuàng)建函數(shù):

var a =function () {
  alert("holl");
}
a();

正常執(zhí)行,彈出ho l l,但是不會再存在函數(shù)聲明提升,執(zhí)行以下代碼后控制臺直接報錯:a is not a function。

a();
var a =function () {
alert("holl");
}

網(wǎng)上另外一個函數(shù)聲明提升的例子

console.log(a); //undefined
if (false) {
function a() {
    console.log(100);
  }
}
a(); //TypeError: a is not a function 理論上應(yīng)該是100

函數(shù)提升發(fā)生在所有代碼執(zhí)行之前,所以盡管a函數(shù)的定義過程寫在了if分支中,但是理論上,它是不會影響函數(shù)聲明提升的

在新版本的瀏覽器中會出現(xiàn)此問題,舊版本的瀏覽器中會在控制臺中打印出100

這也提醒了我們盡量不要在控制語句中進行聲明,會造成很多無法預(yù)知的bug

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容