首先給出結(jié)論,然后再舉例
結(jié)論
提升:函數(shù)聲明和變量聲明提升;函數(shù)賦值和變量賦值不提升
優(yōu)先級: 函數(shù)>變量
特殊情況:if 語句中,函數(shù)聲明提升時,會將前面的變量賦值一起提升出去
聲明提升,賦值不提升
舉例1:函數(shù)
console.log(foo);
function foo(){
console.log("函數(shù)聲明1");
}
var foo = function(){
console.log("函數(shù)聲明2");
}
輸出為:
function foo(){
console.log("函數(shù)聲明");
}
舉例2:變量
console.log(foo);
var foo;
foo = "變量";
輸出為:
undefined
優(yōu)先級
舉例1
console.log(foo);
function foo(){
console.log("函數(shù)聲明");
}
var foo = "變量";
輸出為:
function foo(){
console.log("函數(shù)聲明");
}
代碼實際是:
function foo(){
console.log("函數(shù)聲明");
}
var foo;
console.log(foo);
foo = "變量";
特殊情況:if 語句中,函數(shù)聲明提升時,會將前面的變量賦值一起提升出去
console.log(a); // undefined
if (true) {
a = 1;
function a() {} // 把1提升出去了
a = 2;
}
console.log(a); // 1
看個例子
console.log("1、value: " + a, " type: " + typeof a);
var a = 0;
if (true) {
console.log("2、value: " + a, " type: " + typeof a);
a = 1;
console.log("3、value: " + a, " type: " + typeof a);
a = 2;
console.log("4、value: " + a, " type: " + typeof a);
function a() {}
a = 3;
console.log("5、value: " + a, " type: " + typeof a);
a = 4;
console.log("6、value: " + a, " type: " + typeof a);
}
console.log("7、value: " + a, " type: " + typeof a);
輸出結(jié)果如下:
/***
* 1、value: undefined type: undefined
* 2、value: function a() {} type: function
* 3、value: 1 type: number
* 4、value: 2 type: number
* 5、value: 3 type: number
* 6、value: 4 type: number
* 7、value: 2 type: number
*
* ***/