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(); } |
这些是同义词吗?当
它们基本上是相同的。
1 2 3 4 5 6 7 8 9 10 | function someGlobalFunction() { utilFunction1(); // Error: untilFunction1 is undefined :( utilFunction2(); // Works var utilFunction1 = function() { } function utilFunction2 () { } } |
除非它们被困在关闭中,否则当
我更喜欢使用声明
形式为
为了完整性,您还拥有表单;
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提倡使用第二种方法,因为它不包含像提升这样的隐藏行为——您的代码完全按照它所说的做,不涉及任何技巧。