我們先看兩個相似的代碼
a = 2;
var a ;
console.log(a);
console.log(a);
var a = 2;
第一個輸出的是2
第二個輸出值為underfined
大家可能為會好奇這是為什么呢?
下面我們來研究一下
這是因為變量和函數在內的所有聲明都會在任何代碼被執行前首先被處理
所以第一個代碼實際上是這樣處理的
var a;
a = 2;
console.log(a);
第二個代碼是這樣處理的
var a ;
console.log(a);
a = 2;
這個過程就好像變量和函數聲明從它們在代碼中出現的位置被“移動”到了最上面。這個過程就叫做提升
注意:只有聲明本身會被提升,而賦值或其他運行邏輯會留在原地。如果提升改變了代碼執行的順序,會造成非常嚴重的破壞。函數聲明可以提升,函數表達式不可以提升,
函數優先
函數聲明和變量聲明都會被提升,但是在重復聲明的代碼中函數會首先被提升,然后才是變量
foo();//1
var foo;
function foo() {
? ? console.log(1);?
}
foo = function() {
? ? console.log(2);
}
這個會輸出1而不是2,這段代碼會被引擎理解成下面格式
function foo(){
? console.log(1);
}
foo();? // 1
foo = function(){
? console.log(2);
}
這里var foo盡管出現在function foo()......的聲明之前,但是因為它是重復的聲明(因此被忽略了)因為當有重復聲明時,函數聲明會優先于變量聲明被提升。