var name=function(){}和&;Javascript中的函数名(){}?

var name=function(){}和&;Javascript中的函数名(){}?,javascript,Javascript,可能重复: 假设我们在一个函数中,而不是在全局名称空间中 function someGlobalFunction() { var utilFunction1 = function() { } function utilFunction2 () { } utilFunction1(); utilFunction2(); } 这些是同义词吗?当someGlobalFunction返回时,这些函数是否完全不存在?出于可读性或其他原因,我应该选择其中一种还是另一种?它们

可能重复:

假设我们在一个函数中,而不是在全局名称空间中

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

  function utilFunction2 () {
  }

  utilFunction1();
  utilFunction2();

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

它们基本相同

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

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

  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }
}
除非它们被困在一个闭包中,否则当
someGlobalFunction
返回时,它们都将不再存在

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

形式为
utilFunction2
(称为函数声明)的声明有被命名的好处(即在您喜爱的debuggerTM中显示为
utilFunction2
),其中as
utilFunction1
(称为函数表达式)将作为匿名函数显示


为了完整性,您还需要表单

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

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

是的,它们完全不同:

  • utilFunction1没有名称,因此如果它引发异常,调试工具只会告诉您引发了匿名函数
  • utilFunction2甚至在到达该行之前就可以在功能范围内使用(如fletcher所述)
  • 在IE中的某些情况下,使用utilFunction2表示法可能会导致异常行为
例:


IE将函数范围问题发挥到极致,有效地评估函数,即使没有代码路径

祝贺你!您已经找到了涉及到功能提升的情况

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提倡使用第二种方法,因为它不包含像提升这样的隐藏行为-您的代码完全按照它所说的做,没有技巧。

+1-看起来您已经涵盖了所有内容。还可以注意到,第一个是FunctionExpression,而后一个是FunctionDeclaration。如果或其他非函数块在ECMAScript中无效,则将function语句放在
中;浏览器行为千差万别。避开!
function foo() {
    bar();
    var bar = function bar() { alert('baz'); };
}