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