var name = function(){}&和var之间有什么区别吗? Javascript中的函数名称(){}?

时间:2010-05-28 20:17:54

标签: javascript

  

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

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

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

  function utilFunction2 () {
  }

  utilFunction1();
  utilFunction2();

}

这些是同义词吗?当someGlobalFunction返回时,这些功能是否完全不存在?我是否因为可读性或其他原因而更喜欢其中一种?

3 个答案:

答案 0 :(得分:47)

他们大多数相同。

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

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

  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }
}

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

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

utilFunction2形式的声明(称为函数声明)具有在 your-favorite-debugger <中命名(即显示为utilFunction2)的好处sup> TM ,其中utilFunction1(称为函数表达式)只会显示为匿名函数


为完整起见,您还有表格;

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

...它被称为命名的函数表达式,它有自己的weird properties(和bugs(在旧版本的IE中))。

答案 1 :(得分:9)

是的,它们完全不同:

  • 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将函数范围问题发挥到极致,有效地评估函数,即使它们没有代码路径!

答案 2 :(得分:8)