我們先看兩個(gè)相似的代碼
a = 2;
var a ;
console.log(a);
console.log(a);
var a = 2;
第一個(gè)輸出的是2
第二個(gè)輸出值為underfined
大家可能為會(huì)好奇這是為什么呢嘿歌?
下面我們來研究一下
這是因?yàn)樽兞亢秃瘮?shù)在內(nèi)的所有聲明都會(huì)在任何代碼被執(zhí)行前首先被處理
所以第一個(gè)代碼實(shí)際上是這樣處理的
var a;
a = 2;
console.log(a);
第二個(gè)代碼是這樣處理的
var a ;
console.log(a);
a = 2;
這個(gè)過程就好像變量和函數(shù)聲明從它們在代碼中出現(xiàn)的位置被“移動(dòng)”到了最上面油宜。這個(gè)過程就叫做提升
注意:只有聲明本身會(huì)被提升,而賦值或其他運(yùn)行邏輯會(huì)留在原地走贪。如果提升改變了代碼執(zhí)行的順序朴乖,會(huì)造成非常嚴(yán)重的破壞。函數(shù)聲明可以提升腻窒,函數(shù)表達(dá)式不可以提升滩字,
函數(shù)優(yōu)先
函數(shù)聲明和變量聲明都會(huì)被提升造虏,但是在重復(fù)聲明的代碼中函數(shù)會(huì)首先被提升,然后才是變量
foo();//1
var foo;
function foo() {
? ? console.log(1);?
}
foo = function() {
? ? console.log(2);
}
這個(gè)會(huì)輸出1而不是2麦箍,這段代碼會(huì)被引擎理解成下面格式
function foo(){
? console.log(1);
}
foo();? // 1
foo = function(){
? console.log(2);
}
這里var foo盡管出現(xiàn)在function foo()......的聲明之前漓藕,但是因?yàn)樗侵貜?fù)的聲明(因此被忽略了)因?yàn)楫?dāng)有重復(fù)聲明時(shí),函數(shù)聲明會(huì)優(yōu)先于變量聲明被提升挟裂。