JavaScript解釋器中存在一種變量聲明被提升(hoisting)的機(jī)制,也就是說變量(函數(shù))的聲明會(huì)被提升到作用域的最前面,即使寫代碼的時(shí)候是寫在最后面,也還是會(huì)被提升至最前面。例如以下代碼段:alert(foo);//functionfoo(){}alert(bar);//undefinedfunctionfoo(){}varbar=functionbar_fn(){};alert(foo);//functionfoo(){}alert(bar);//functionbar_fn(){}輸出結(jié)果分別是functionfoo(){}、undefined、functionfoo(){}和functionbar_fn(){}。可以看到foo的聲明是寫在alert之后,仍然可以被正確調(diào)用,因?yàn)镴avaScript解釋器會(huì)將其提升到alert前面,而以函數(shù)表達(dá)式創(chuàng)建的函數(shù)bar則不享受此待遇。那么bar究竟有沒有被提升呢,其實(shí)用var聲明的變量都會(huì)被提升,只不過是被先賦值為undefined罷了,所以第二個(gè)alert彈出了undefined。所以,JavaScript引擎執(zhí)行以上代碼的順序可能是這樣的:創(chuàng)建變量foo和bar,并將它們都賦值為undefined。創(chuàng)建函數(shù)foo的函數(shù)體,并將其賦值給變量foo。執(zhí)行前面的兩個(gè)alert。創(chuàng)建函數(shù)bar_fn,并將其賦值給bar。執(zhí)行后面的兩個(gè)alert。注:嚴(yán)格地說,再JavaScript中創(chuàng)建函數(shù)的話,還有另外一種方法,稱為“函數(shù)構(gòu)造法”:varfoo=Function('alert("hi!");');varfoo=newFunction('alert("hi!");');//等同于上面一行此方法以一個(gè)字符串作為參數(shù)形成函數(shù)體。但是用這種方法,執(zhí)行效率方面會(huì)打折扣,且似乎無法傳遞參數(shù),所以少用為妙。