2012-02-24 76 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