Function decaration in Javascript
Possible Duplicate:
What is the difference between a function expression vs declaration in Javascript?
以这些方式声明函数之间是否存在主要差异:
1 2 3
| function foo(){
alert('BAR');
} |
1 2 3
| var foo = function (){
alert('BAR');
} |
1 2 3
| var foo = function bar(){
alert('BAR');
} |
有人告诉我:
It happens at a different time, and results in a variable referring to an anonymous function. A function declaration happens prior to any stepwise code executing in the scope, and results in both a binding and a function with a proper name.
我声明函数的方式真的会影响代码的效率吗?如果是,哪种方式最适合使用?
- 你问这个问题之前有没有做过调查?网络上对此充满了解释。
- @安吉尔,是的,我有,我的意见非常复杂……
- @有些人有麻烦,你可以在活动中给他们打电话。
- 简而言之,命名函数表达式只对一件事有用——在调试器和分析器中使用描述性函数名。好吧,也有可能使用函数名进行递归,但是你很快就会发现这在现在通常是不切实际的。如果您不关心调试经验,那么就没有什么可担心的了。kangax.github.com/nfe.
- @马特,你说得对。
- @有人遇到麻烦:你可以通过一个活动给他们中的任何一个打电话。
- 对我来说,这个问题的反对票似乎很严厉。(近距离投票是有意义的。)
- @T.J.克劳德,我怎么叫第二个呢
- @克劳德是的,我不知道为什么投反对票。我在发帖前就在上面搜索过这个,有人发现了。
- @有人出了问题
- @T.J.克劳德:你为什么要区分这两者?如果它应该关闭,那就是说它不应该基于给出的原因被询问。因为这个原因,DV似乎是值得的。(一般来说,不一定是这样。我在这个职位上没有投票。)
- @羊膜炎,这不是投反对票的原因。
- @尼尔:当然。它评估了文章的质量和OP的研究成果。如果它不属于这里,或者如果它已经被问过(显示缺乏研究),那么这些就是DV的原因。(再说一遍,不必说你的问题。)
- fwiw,在我看来,您似乎在问是否/如何每种方式都会影响代码的效率。我不明白提议的副本是怎么问的。但是,再一次,我也看不出你接受的答案是如何回答的。
是的,有一个很大的区别。
第一个是函数声明。它发生在进入执行上下文时,在处理任何一步一步的代码之前。它不能在任何类型的控制块内(例如,它在if语句的主体中是不合法的;但是,如果您这样做,大多数浏览器都会尝试适应它;有时会导致非常令人惊讶的行为与规范不符)。它产生一个命名函数。
第二个是函数表达式(特别是匿名函数表达式)。与所有表达式一样,它是在代码的逐步执行中遇到的时候处理的。和所有表达式一样,它也可以在一个控制块内。它会产生一个没有名称分配给具有名称的变量的函数。
第三个是命名函数表达式。它是一个与上面类似的函数表达式,但是函数也有一个名称。您希望通过IE8和更早的版本避免这些问题,因为IE实际上会出错,创建两个单独的函数(在两个不同的时间)。(基本上,IE将其视为一个函数声明和一个函数表达式。)IE9最终获得了这一权利。
请注意,第二个和第三个示例依赖于自动分号插入;因为它们都是赋值语句,所以它们应该以;结尾(在函数的}结束之后)。
- 浏览器允许在块内以非严格模式声明函数,但这仅仅是因为它们有非标准的扩展来处理它。
- @蒂姆:不是所有人都这样。比如,火狐的蜘蛛猴引擎就没有。即使在相对简单的情况下,如果它们是逐步代码,它们也不会一直运行(就像一个没有前面分支的try块)。
- 火狐确实能处理它,因为它不会抛出错误。
- @但是蜘蛛猴呢?我没有要测试的火狐3.x或其他东西
- @蒂姆:刚在火狐13上试用过,它就允许了:jsbin.com/atusib和我碰巧在一个Windows虚拟机上放了火狐3.6.15,它也允许了!非常,非常惊讶,因为我清楚地记得一年前我做的工作仅仅在FF中失败,因为我盲目地将函数的内容包装在try..catch中,并且没有注意到其中包含声明。而且它也不是严格的代码(有问题的项目没有使用它)。我想知道有什么不同…
- @伊莎莉亚:我很肯定。请参阅developer.mozilla.org/en/javascript/reference/…,它自2008年以来一直在MDN上运行。
- @提姆:不知道你是否看到了上面的内容,但至少火狐3.6.15支持你的说法。谢谢。现在我想回到过去,看看上面提到的代码发生了什么。:-)我知道这并不严格,但我已经玩过这个jsbin,不能让ff 3.6.15复制我记忆中的内容。我知道是火狐。Enh,不管怎样。:-)但是注意:jsbin.com/atusib/5这种行为可能非常非常令人惊讶(FF将它们视为表达式、chrome和ie类声明)。