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

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

在定義函數時,咱們通常使用下面這兩種方法:函數

使用函數聲明定義:spa

1
2
3
function  sum (a, b) {
     return a + b;
}

使用函數表達式定義:code

1
2
3
var sum = function (a, b) {
     return a + b;
}

調用方法都是同樣的:ip

如求「1+1」等於幾:ci

1
alert(sum(1, 1));

但這兩種方法仍是有區別的。解析器在向執行環境中加載數據時,對函數聲明和函數表達式並不是一視同仁。解析器會率先讀取函數聲明,並使其在執行任何代碼以前可用;而函數表達式,則必須等到解析器執行到它所在的代碼行,纔會真正被解釋執行。io

示例:table

1
2
3
4
alert(sum(1, 1));
function  sum (a, b) {
     return a + b;
}

以上代碼能夠正常執行。由於在代碼執行以前,解析器就已經經過一個名爲函數聲明提高的過程,讀取並將函數聲明添加到執行環境中。在對代碼求值時,Javascript引擎在第一遍會聲明函數並將它們放到源代碼樹的頂部。因此,即便聲明函數的代碼放到了調用它的代碼的後面,Javascript引擎也能把函數聲明提高到頂部。若是像下面例子所示,把上面的函數聲明改成函數表達式,就會在執行期間致使錯誤。function

1
2
3
4
alert(sum(1, 1));
var sum = function (a, b) {
     return a + b;
}

以上代碼之因此會在執行期間產生錯誤,緣由在於函數位於一個初始化語句中,而不是一個函數聲明。換句話說,在執行到函數所在的語句以前,變量sum不會保存有對函數的引用,而且第一行代碼已經產生錯誤,也就不會執行到下一行。class

整體來講,除了何時能夠經過變量訪問函數這一點區別以外,函數聲明與函數表達式的語法實際上是等價的。變量

相關文章
相關標籤/搜索