在js中 變量聲明與賦值被認爲是兩個不一樣的操做,引擎首先會對前者進行優先編譯,這部分工做就是找到全部的聲明(例如函數聲明function b(注:非函數表達式),變量聲明var a),既然是優先執行,那麼在一些代碼結構中,後聲明的function,var 變量就會提早解釋;函數
例如 var a=3;引擎會認爲這是兩個操做 var a(聲明); a=3(賦值),簡而言之就是 先有蛋 後有雞,io
理解了這一點 這就很好解釋以下的代碼結構及其輸出console
a=2;
var a; //定義聲明提高
console.log(a) //獲得2編譯
-------------------分割線-------------------function
console.log( a );//獲得undefined
var a = 2; //等效於var a;//定義聲明置頂 a=2;變量
-------------------分割線-------------------co
foo(); //獲得666工作
function(){分割
console.log(666)函數表達式
}
-------------------分割線-------------------
foo(); //報錯 信息爲 Uncaught TypeError: foo is not a function,由於此時 foo爲undefined,而不是一個函數
var foo = function(){
console.log(6666)
}