在JavaScript中,var name = function() {} 和 function name() {} 有什么区别吗?

33

可能是重复问题:
JavaScript:var functionName = function() {} vs function functionName() {}

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

function someGlobalFunction() {
  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }

  utilFunction1();
  utilFunction2();

}

这两者是否同义?当someGlobalFunction返回时,这些函数完全停止存在吗?我应该优先选择哪一个以提高可读性或其他原因?

3个回答

49

它们基本上是相同的。

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

function someGlobalFunction() {
  utilFunction1(); // Error: untilFunction1 is undefined :(
  utilFunction2(); // Works

  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }
}

除非它们被困在闭包中,否则两者都会在someGlobalFunction返回时停止存在。

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

utilFunction2形式声明的函数(称为函数声明)具有命名的优点(即显示为utilFunction2)在您最喜欢的调试器中,而utilFunction1(称为函数表达式)只会显示为一个匿名函数。


为了完整起见,还有以下形式:

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

...这被称为命名函数表达式,它具有自己的奇怪属性(并且在旧版IE中存在bug)。


+1 - 看起来你已经准备好了一切。 - ChaosPandion
3
值得注意的是,前者是一个函数表达式,而后者是一个函数声明。 - Sean Kinsey

11

是的,它们之间有很大的区别:

  • utilFunction1 没有名称,因此如果它抛出异常,您的调试工具只会告诉您匿名函数抛出了异常
  • 即使在到达那一行之前,utilFunction2 也将在函数作用域内可用(如 fletcher 所指出的)
  • 在某些情况下,使用 utilFunction2 符号表示法可能会导致 IE 中出现奇怪的行为。

例如:

if (true) {
  function utilFunction() {
    return true;
  }
} else {
  function utilFunction() {
    return false;
  }
}

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

IE在函数作用域问题上走向了极端,即使没有到达函数的代码路径,也会有效地评估函数!


7
将函数语句放置在 if 或其他非函数块中在 ECMAScript 中是无效的;浏览器行为变化巨大。建议避免这种写法! - bobince

8
恭喜你!你遇到了函数提升的情况。
var foo = function() { };

与之相比是非常不同的

function foo() { };

除了其他原因外,还有一个原因。

第二个例子将被“提升” - 它将在当前闭包(通常是当前函数)的任何地方都可用。即使在该闭包内它还没有被声明。

类似以下代码可以使用:

function foo() {
    bar();
    function bar() { alert('baz'); }
}

这样的文本可能不太合适:

相反,像这样的内容肯定不适用:

function foo() {
    bar();
    var bar = function bar() { alert('baz'); };
}

在第二个例子中,您会遇到错误,因为bar尚未定义。如果在函数foo中交换这两行代码,那么该示例将正常工作。
Douglas Crockford主张使用第二种方法,因为它不包含像变量提升这样的隐藏行为-您的代码完全按照其字面意思执行,没有任何诡计。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接