2012-02-24 74 views
39

可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}
Declaring functions in JavaScriptJavaScript函數定義語法

我見過2個不同的語法來在javascript定義函數:

function f() { 
    ... 
} 

除了如

var f = function() { 
    ... 
}; 

這些有什麼區別?其中之一是否被棄用?

+0

下面是對您的問題的答案:http://stackoverflow.com/a/1013387/236135這是用正確的術語問的問題http://stackoverflow.com/questions/1013385/what-is-the函數表達式與聲明中的函數表達式聲明 – 2012-02-24 00:46:52

回答

44

兩者都不推薦使用,兩者都可以使用。這裏的區別在於一個是命名函數(function f()),另一個是等於函數的變量(var f = function())。

設置變量等於函數時必須小心。這將工作:

var f = function(n) { console.log(n); }; 
f(3); // logs 3 

但是,這將打破,因爲變量在調用它之後定義

f(3); // what is f? breaks. 
var f = function(n) { console.log(n); }; 

但正常的功能正常工作。

function abc(n) { console.log(n); } 

abc(3); // logs 3 
xyz(5); // logs 5 

function xyz(n) { console.log(n); } 

這是因爲在執行之前分析了代碼,並且可以調用所有函數。但設置一個var等於一個函數就像設置一個var到其他任何東西。什麼時候發生的順序很重要。

現在對於一些比較混亂的東西...

也有「自執行」匿名函數。他們有各種各樣的名字。最常見的做法如下:

(function() { 
    // code in here will execute right away 
    // since the() at the end executes this (function(){}) 
})(); 

還有一個可以說是更好的版本。

!function() { 
    // again, the tailing() will execute this 
}(); 

查看this Stack Overflow post瞭解更多有關匿名功能的信息。

+1

您也可以自行調用命名函數:'(function foo(){...}())',或指定的函數一個變量:'var foo = function bar(){...};'。實際值得注意的區別是,一個是*函數聲明*,它總是必須命名,而*函數表達式*可以是命名或匿名的。 – 2012-02-24 00:53:37

+0

@FelixKling好點。自調用的命名函數'(function foo(){...}())'很有意思,因爲你可以從內部調用'foo',但不能在外面調用。即使將它寫爲'!function foo(){...}();'。 – Marshall 2012-02-24 00:59:12

+1

是的,當你有一個命名的函數表達式時,這個名字只在函數本身內部可用。不幸的是,IE在命名函數表達式中存在一些問題(它創建了相同函數的兩個副本),所以最好避免。但理論上它可行;) – 2012-02-24 01:03:32