2011-10-11 95 views
4

在Javascript中,我已经看到了三种不同的方式来定义函数。JavaScript函数声明风格

  • 传统风格:

function foo() { //do something }

  • 新的js忍者风格

var foo = function(){ //do something }

  • DOM特定样式

window.foo = function(){ //do something }

是什么问题,

是什么上述三者的区别?为什么我应该使用哪一个&?

+0

可能重复[Javascript:var functionName = function(){} vs function functionName(){}](http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function- functionname)。 –

+0

也var foo =功能foo(){//做点什么} –

回答

10

第一个是函数声明。它被悬挂起来(你可以在当前范围内的任何地方使用它)。

第二个是使用匿名函数的变量定义。变量悬挂,任务保持原位。该功能可能无法使用,直到您分配它的行。

第三个是分配一个全局方法。与第二个类似,虽然与全局对象一起工作,但这并不好。

然而,你能想到的第四种方法(称为函数表达式):

var foo = function bar(){ //do something } 

这里,酒吧将只提供内部本身,这是递归有用,而不是与它搅动目前的范围。

您正在根据您的需求选择任何方法。我只会投票反对第二种方法,因为它使函数的行为像一个变量。

只要您提到第二个和第三个选项,我想提醒一下,污染性的全局对象是considered bad practice。您最好考虑使用自动执行的匿名函数来创建单独的范围,例如

(function(){ 
    var t = 42; // window.t still does not exist after that 
})(); 

我想你可能会发现在JavaScript Scoping and Hoisting有用的更详细的文章。

+0

它的“悬挂”是什么意思?此外,我声明使用2nd Approch有什么不利之处。因为从我对JavaScript的理解有限,一切都是一个对象 - 变量,函数。 – CuriousMind

+0

你可以参考我提到的文章了解更多细节。简而言之,所有变量和函数声明都在内部被提升(提升)到当前范围的开始。首先是函数,然后是变量。作业留在原地。 – Li0liQ

+0

优秀的文章+文章是伟大的。 –

2

首先,请参阅Javascript: var functionName = function() {} vs function functionName() {}

然后我们找到var foo =window.foo =之间的差异。

第一个是一个局部范围的变量,它非常可爱(除非它在全局范围内完成)。其次是一个明确的全局,它具有全局的所有常见问题(例如与其他代码冲突的可能性)。

+0

如果我想声明一个全局函数 - 这两个没有什么区别? – CuriousMind

+1

通常你应该避免在全球范围内做任何事.. @ Gaurish。 –