在javascript中var name=function()和function name()之间有什么区别吗?

Is there any difference between var name = function() {} & function name() {} in Javascript?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
JavaScript: var functionName = function() {} vs function functionName() {}

假设我们在一个函数内部,而不是在全局命名空间中。

1
2
3
4
5
6
7
8
9
10
11
function someGlobalFunction() {
  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }

  utilFunction1();
  utilFunction2();

}

这些是同义词吗?当someGlobalFunction返回时,这些函数是否完全不存在?出于可读性或其他原因,我应该选择一个还是另一个?


它们基本上是相同的。

utilFunction1只有在声明后才可用。utilFunction2被提升到函数的顶部,因此可以在定义之前使用。

1
2
3
4
5
6
7
8
9
10
function someGlobalFunction() {
  utilFunction1(); // Error: untilFunction1 is undefined :(
  utilFunction2(); // Works

  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }
}

除非它们被困在关闭中,否则当someGlobalFunction返回时,两者都将不复存在。

我更喜欢使用声明utilFunction2的方法,但这取决于您。

形式为utilFunction2的声明(称为函数声明)有利于在您最喜欢的debuggerTM中命名(即显示为utilFunction2),其中,作为utilFunction1的声明(称为函数表达式)只显示为匿名函数。

为了完整性,您还拥有表单;

1
2
3
var utilFunction3 = function utilFunction4() {
    // blah
};

…这被称为命名函数表达式,它有自己奇怪的属性(以及错误(在旧版本的IE中))。


是的,它们完全不同:

  • utilFunction1没有名称,因此如果它抛出异常,调试工具将只告诉您匿名函数抛出了
  • 效用函数2将在函数范围内可用,甚至在到达该行之前(如弗莱彻所述)
  • 在IE中,使用utilFunction2表示法可能会导致某些情况下的异常行为。

前任:

1
2
3
4
5
6
7
8
9
10
11
if (true) {
  function utilFunction() {
    return true;
  }
} else {
  function utilFunction() {
    return false;
  }
}

utilFunction(); // returns false in IE, true everywhere else

IE将函数范围问题推向极端,有效地评估函数,即使没有代码路径指向它们!


祝贺你!你已经找到了涉及函数提升的情况。

1
var foo = function() { };

与…完全不同

1
function foo() { };

因为其他地方提到的所有原因,加上一个。

第二个例子将是"提升"——它将在当前关闭的任何地方可用(通常是当前功能)。甚至在宣布关闭之前。

类似这样的方法会奏效:

1
2
3
4
function foo() {
    bar();
    function bar() { alert('baz'); }
}

然而这样的事情绝对不会:

1
2
3
4
function foo() {
    bar();
    var bar = function bar() { alert('baz'); };
}

在第二个示例中,您会得到一个错误,因为尚未定义条。如果您交换函数foo中的两行,那么该示例将起作用。

DouglasCrockford提倡使用第二种方法,因为它不包含像提升这样的隐藏行为——您的代码完全按照它所说的做,不涉及任何技巧。