将函数声明为var而不是function


28

我越来越看到函数被声明为

var foo = function() {

    // things
};

而不是我所学到的

function foo() {

    // things
}

有什么不同?更好的性能?范围?我应该使用这种方法吗?


值得注意的是,在javascript中,函数是一等公民。这使您可以像对象一样传递行为。这对回调和委派非常有用。
克里斯·拜

范围。包裹名称“ // things”的变量在本质上/希望防止包裹的“ // things”与其他JavaScript(文件)发生名称冲突。另一种思考的方式是您创建了一个名称空间“ foo”。
Radarbob 2012年

Answers:


25

var foo = function() {} 定义引用匿名函数的变量。

function foo() {}定义一个命名函数foo

两者都可以通过名称作为函数参数传递,并且如果预期用途是针对OOP,则可以实例化。

归根结底,您使用的是很大程度上由您的特定用例决定的(JavaScript很有趣;)。如果最终使用前者,我强烈建议您将函数命名为:

var foo = function MY_function() {}。此命名约定可帮助您的调试器调用栈不再无用。


1
在函数()MY上有个
傻瓜

1
@Demian Brecht,那么var foo = function foo(){...}方法呢?
shabunc

@shabunc:那呢?它在我的答案的最后一段中列出。
Demian Brecht

@Demian Brecht,不,实际上在最后一段中调用了变量,并调用了foo函数MY_function
shabunc 2012年

@shabunc:名称无关紧要。重要的是调用堆栈中的值。例如,[NAMESPACE] _ [fn name]是Mozilla使用的约定。只要您的约定在整个项目中保持一致,名称本身就没有关系。
Demian Brecht

13

函数表达式:

//someFunction(); //wouldn't work when uncommented
var someFunction = function(){ alert('yay'); };

在这种情况下,func表达式是匿名的,但已分配给var供参考。这与标记的函数语句在以下方面有所不同:

  • 无法吊起(在定义之前调用)
  • new someFunction().constructor.name === 'someFunction';//false 实例没有获得Constructor.name的var名称,因为对该函数的引用已分配给var,但var(而不是函数)绑定到var名称

在带有标签的函数语句中:

//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
  • 吊装工程
  • new someFunction().constructor.name === 'someFunction'; //true 名称直接绑定到函数。

通常来说,没有真正的理由对var进行表达,除非您希望在事情四处移动或您在一行中定义/分配方法时调用失败。我实际上发现提升对于在底部组织内部函数和方法定义的对象很有用,这样我就可以了解对象的实际行为,并一站式地进行单行公共方法定义(通过将func分配给this.相同的名称)现货供参考。您应该始终尝试对构造函数IMO使用带标签的语句,以便可以通过其构造函数识别对象的“类型”。


8

您的第一个示例是表达式,而第二个示例是语句。将函数定义为表达式可以在定义发生的位置,可以将其分配给什么,可以将其作为参数传递等方面提供更大的灵活性。

例如:

SomeThing('abc', function(a,b) {return a*b;});

与...

function tmp(a,b) { 
    return a*b;
}

SomeThing('abc', tmp);

没有函数表达式语法,更复杂的示例将变得非常复杂。

看看https://stackoverflow.com/questions/111102/how-do-javascript-closures-work


4

实际的主要区别是吊装。例如:

foo(); // alerts 'hello'
function foo() {alert('hello');}

foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}

另外,这是未定义的行为

function foo(){
  if (true) {
    function bar(){}
  }
  bar();
}

虽然可以。

function foo(){
  if (true) {
    var bar = function(){}
  }
  bar();
}

7
在JS函数中定义函数绝对没有错。在JS中无法定义函数的地方不多。
埃里克·雷彭

2
@ErikReppen您绝对不能在非函数块中使用函数声明(例如,在if语句中)。我似乎找不到我在其他功能中无法使用它们的地方。
奥斯丁

@Austin if语句内的函数定义也没有错!
蒂姆(Tim)

@奥斯丁:也许您在w3schools读过它?;)
Demian Brecht 2012年

2
@ErikReppen函数表达式可在任何地方使用。函数声明不能​​。见stackoverflow.com/questions/10069204/...
奥斯汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.