函數聲明與函數表達式的區別

實際上,解釋器在向執行環境加載數據時,對函數聲明與函數表達式並不是一視同仁的。解析器會率先讀取函數聲明,並使其中在執行任何代碼之前可以訪問,至於函數表達式,則必須等到解析器執行到它所在的代碼行時,纔會被真正解析執行的。

先看個例子:

alert(sum(10,10));

function sum(num1,num2){

return num1+num2;

}

上面的例子是可以正常執行的。因爲在代碼執行之前,解析器已經通過一個名爲聲明函數提升過程。讀取並將函數聲明添加到執行環境中。然後在對代碼求值時,js引擎在第一遍會聲明函數,並將它們放在源代碼樹的頂部,所以,即使聲明函數的代碼在調用它的代碼之後,js引擎也能將函數聲明提升到頂部。

我們再看一個例子:

alert(sum(10,10));

var sum=function(num1,num2){

return num1+num2;

}

以上代碼會在運行期間產生錯誤,原因在於函數位於一個初始化語句中,而不是函數聲明,在執行到函數所在的語句之前,變量sum中不會保存有對函數的引用;而且,由於第一行代碼就會導致“意外標示符”的錯誤,實際上也不會運行到下一行的。


還有,如果要訪問函數的指針而不執行其函數體的話,必須去掉函數名後面的那對圓括號!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章