2010-05-28 89 views
25

可能重复:
JavaScript: var functionName = function() {} vs function functionName() {}Javascript中的var name = function(){}和函数名(){}有什么区别吗?

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

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

    function utilFunction2() { 
    } 

    utilFunction1(); 
    utilFunction2(); 

} 

这些是同义词吗?当someGlobalFunction返回时,这些函数是否完全不存在?为了可读性或其他原因,我应该更喜欢哪一种?

回答

46

他们是大多是一样。

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

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

    var utilFunction1 = function() { 
    } 

    function utilFunction2() { 
    } 
} 

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

我倾向于使用声明utilFunction2的方法,但这取决于您。形式utilFunction2

声明(这是所谓的函数声明)有被命名(即显示为utilFunction2)在你最喜欢的调试器TM,其中作为utilFunction1(称为函数表达式)将受益只是显示为匿名功能


为了完整性,您也有表格;

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

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

+0

+1 - 看起来你已经覆盖了一切。 – ChaosPandion 2010-05-28 20:27:21

+3

也可以注意到,第一个是FunctionExpression,而后一个是FunctionDeclaration。 – 2010-06-01 18:37:34

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需要的功能范围问题到了极致,有效地评估功能,即使没有代码路径给他们!

+7

在一个'if'或其他非函数块中放置函数语句在ECMAScript中无效;浏览器行为差异很大。避免! – bobince 2010-05-28 21:20:49

8

恭喜!你已经发现功能提升涉及的情况。

var foo = function() { }; 

function foo() { }; 

对于其他地方所指出的所有原因,再加上一个很大的不同。

第二个示例将“悬挂” - 它将在当前闭包中的任何位置(通常是当前函数)可用。甚至在封闭之前宣布它。

像这样的东西会工作:

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

而像这样的绝对不是:

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

你在第二个例子中得到一个错误,因为酒吧尚未确定然而。如果将功能foo中的两条线路交换,则该示例将起作用。

道格拉斯克罗克福德提倡使用第二种方法,因为它不包含像提升一样的隐藏行为 - 您的代码完全按照它说的做,不涉及任何技巧。

相关问题