1. 程式人生 > >JavaScript 函數聲明與函數表達式的區別 函數聲明提升(function declaration hoisting)

JavaScript 函數聲明與函數表達式的區別 函數聲明提升(function declaration hoisting)

代碼 調用 UNC 之前 的區別 ted urn function fun

解析器在向執行環境中加載數據時,對函數聲明和函數表達式並非一視同仁。解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用(可以訪問)。至於函數表達式,則必須等到解析器執行到它所在的代碼行,才會真的被解釋執行。例子:

alert (sum(10,10));
function sum (num1, num2) {
    return num1 + num2;
}

以上代碼完全可以正常運行。因為在代碼開始執行之前,解析器就已經通過一一個名為函數聲明提升(function declaration hoisting )的過程,讀取並將函數聲明添加到執行環境中。對代碼求值時,JavaScript引擎在第一 遍會聲明函數並將它們放到源代碼樹的頂部。所以,即使聲明函數的代碼在調用它的代碼後面,JavaScript引擎也能把函數聲明提升到頂部。

如果像下面例子所示的,把上面的函數聲明改為等價的函數表達式,就會在執行期間導致錯誤。

alert (sum(10,10));
var sum = function (num1, num2) {
    return num1 + num2;
}

以上代碼之所以會在運行期間產生錯誤,原因在於函數位於一個初始化語句中, 而不是個函數聲明。換句話說,在執行到函數所在的語句之前,變量sum中不會保存有對函數的引用;而且,由於第一行代碼就會導致 “unexpected identifier” (意外標識符)錯誤,實際上也不會執行到下一行。
除了什麽時候可以通過變量訪問函數這一點區別之外, 函數聲明與函數表達式的語法其實是等價的。

JavaScript 函數聲明與函數表達式的區別 函數聲明提升(function declaration hoisting)