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