相信兩種方式大家都用過,但未必所有人都知道其 區別,內部原理。
// 方式1
function func1(x,x, y){
// your code
}
// 方式2
var func2 = function(x,y){
// your code
}
方式1 是典型的函數宣告(Function declarations)。
方式2 是函數表達式(Function expressions),將一個匿名函數賦值給一個變數。或者說方式2中創建了一個具有形參為x,y的匿名函數,然後把該匿名函數賦值給變數func2。
其主要區別在於:
1,函數宣告需顯示的指定函數名,這裡是func1;函數表達式則使用匿名函數
2, 方式1在程式碼執行之前(解釋期)被載入到作用域中,方式2則需在程式碼執行時(運行期)載入
一個簡單範例就明白了它們在使用上的區別
alert(func1); // --> func1原始碼
alert(func2); // - -> undefined
// 方式1
function func1(x,y){
// your code
}
// 方式2
var func2 = function(x,y ){
// your code
}
可以看到,第一次彈出的是func1的源碼,第二次卻是undefined。即採用方式1(函數宣告)定義函數,可以在該函數程式碼之上使用它,採用方式2(函數表達式)定義函數則不能在其定義前使用,只能在其定義後使用。
其內部涉及到 執行上下文(Execution context)及 啟動物件(Activation object)。想更深入了解的請閱讀EcmaScript 5文件。
最近發現越來越多的人喜歡使用方式2定義函數,尤其在巢狀函數中。如單純的定義一個函數個人還是習慣方式1。