Javascript中的函数声明[重复]

Posted

技术标签:

【中文标题】Javascript中的函数声明[重复]【英文标题】:Function decaration in Javascript [duplicate] 【发布时间】:2012-06-17 15:57:20 【问题描述】:

可能重复:What is the difference between a function expression vs declaration in javascript?

以这些方式声明函数之间是否存在主要区别:

    function foo()
         alert('BAR');
    
    
    var foo = function ()
         alert('BAR');
    
    
    var foo = function bar()
         alert('BAR');
    
    

有人告诉here:

它发生在不同的时间,并导致一个引用匿名函数的变量。函数声明发生在范围内执行任何逐步代码之前,并导致绑定和具有正确名称的函数。

我声明函数的方式真的会影响我的代码效率吗?如果是的话,哪种方式最好用?

【问题讨论】:

在问这个问题之前你有没有研究过?网络上有很多关于这个的解释。 @Angel 是的,我做到了,我得到了非常非常复杂的意见...... @Somebodyisintrouble 您可以在活动中致电他们中的任何一个。 简而言之,命名函数表达式仅对一件事有用——调试器和分析器中的描述性函数名称。好吧,也有可能使用函数名进行递归,但是您很快就会发现这在当今通常是不切实际的。如果您不关心调试体验,则无需担心。 kangax.github.com/nfe. 对这个问题的反对意见对我来说似乎非常苛刻。 (接近投票是有道理的。) 【参考方案1】:

是的,有很大的不同。

第一个是函数声明。它发生在进入执行上下文时,在处理任何分步代码之前。它不能在任何类型的控制块中(例如,它在 if 语句的主体中是不合法的;但是,如果您这样做,大多数浏览器会尝试容纳它——有时会导致 very surprising behavior——与规格)。它会产生一个命名函数。

第二个是函数表达式(具体来说,一个匿名函数表达式)。像所有表达式一样,它在代码的逐步执行中遇到它时会被处理。和所有表达式一样,它可以在控制块内。它会导致一个没有名称的函数分配给一个有名称的变量。

第三个是命名函数表达式。这是一个像上面一样的函数表达式,但函数也被赋予了一个名称。你想avoid these with IE8 and earlier,因为 IE 实际上会弄错,创建两个单独的函数(在两个不同的时间)。 (基本上,IE 将其视为函数声明函数表达式。)IE9 终于做到了这一点。

请注意,您的第二个和第三个示例依赖于自动分号插入;因为这两个都是赋值语句,所以它们应该以; 结尾(在函数的结尾 之后)。

【讨论】:

浏览器确实允许在非严格模式的块中声明函数,但这只是因为它们有非标准的扩展来处理它。 @TimDown:并非所有人都这样做。例如,Firefox 的 SpiderMonkey 引擎就没有。即使在相对简单的情况下,如果它们是逐步代码,它们总是会运行(比如没有前面分支的 try 块)。 Firefox 会处理它,因为它不会抛出错误。 @TimDown 但是蜘蛛猴呢?我没有 firefox 3.x 或任何要测试的东西 @Tim:刚刚在 Firefox 13 上尝试过,它允许它:jsbin.com/atusib 我碰巧在 Windows 虚拟机中放置了 Firefox 3.6.15,并且 也允许!对此非常非常惊讶,因为我清楚地记得大约一年前我所做的工作只在 FF 中失败,因为我盲目地将函数的内容包装在 try..catch 中并且没有注意到它里面有一个声明。它也不是严格的代码(有问题的项目没有使用它)。我想知道有什么不同...

以上是关于Javascript中的函数声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章

javascript函数声明和范围差异[重复]

在构造函数与原型中声明javascript对象方法[重复]

混淆 Javascript 函数和参数声明 [重复]

javascript函数(声明,传参,返回值,递归)

函数声明和函数表达式可以互换使用吗? [重复]

不同的函数声明[重复]