在定義函數時,咱們通常使用下面這兩種方法:函數
使用函數聲明定義: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
整體來講,除了何時能夠經過變量訪問函數這一點區別以外,函數聲明與函數表達式的語法實際上是等價的。變量