在javascript中,函數有兩種定義寫法,函數定義表達式和函數聲明,其例子分別如下所示:
var test = function(x){
return x;
}
function test(x){
return x;
}
盡管函數定義表達式和函數聲明語句包含相同的函數名,並且都創建了新的函數對象,但是這二者卻有區別。
函數聲明語句中的函數名是一個變量名,變量指向函數對象。
函數定義表達式和通過var聲明變量一樣,其函數被提前到了腳本或函數的頂部,因此它在整個腳本和或函數內都是可見的。這樣的話,只有函數變量聲明提前了,函數的初始化代碼仍然在原來的位置。但是使用函數聲明的話,函數名稱和函數體均提前了,即腳本中的函數和函數中嵌套的函數都會在當前上下文中其它代碼之前聲明,也即可以在聲明一個函數之前調用它。
舉個例子:
test(1);
function test(x){
console.log(x);
}
上述代碼能正常執行,結果輸出為1;因為對於函數聲明語句,函數名稱和函數體均提前聲明了,可以在聲明之前調用它。
test(1);
var test = function(x){
console.log(x);
}
上述代碼不能正常執行,會報錯。
因為對於函數定義表達式,只有函數變量聲明提前了,但是函數的初始化代碼仍然在原來的位置,也即相當於如下的代碼
var test; //函數變量聲明提前
test(1);
var test = function(x){
console.log(x);
}
因此,會報錯test不是一個函數的錯誤。