【问题标题】:What's the difference between this two ways of defining a function in JavaScript? [duplicate]这两种在 JavaScript 中定义函数的方式有什么区别? [复制]
【发布时间】:2011-03-15 09:53:23
【问题描述】:

可能重复:
Javascript: var functionName = function() {} vs function functionName() {}

方式一:

function fancy_function(){
    // Fancy stuff happening here
}

方式2:

var fancy_function = function(){
    // Fancy stuff happening here, too.
}

我在定义一个“正常”函数时使用前者,我将使用一次或多次,而后者在我向它传递另一个函数的回调时使用,但它看起来可以工作两种方式都很好。

在某些方面真的有区别吗?

【问题讨论】:

  • 这里已经多次得到很好的回答。只需在 google 或 stackoverflow 上搜索即可。
  • 谢谢你,@Anurag。我已经选择了一个答案来关闭它。以后我会更加谨慎。
  • @Eric - 不用担心。我的观点是,链接的文章已经存在了很长时间,并且包含一些经过深思熟虑的答案。很难在 15 分钟内找到一个经过深思熟虑、经过编辑、精炼的答案。

标签: javascript


【解决方案1】:

函数本身没有区别,但后者为您提供了更大的灵活性,因为您有对该函数的引用,并且在被覆盖时它的行为方式有所不同。

这使您可以通过后者实现您无法通过前者实现的行为;例如以下技巧来“覆盖”现有函数,然后调用“基础”:

var myOriginalFunction = function() {
    window.alert("original");
}

var original = myOriginalFunction;

var myOriginalFunction = function() {
    window.alert("overridden");
 original();
}

myOriginalFunction();

这会为您提供“已覆盖”警报,然后是“原始”警报。

但是,如果您尝试使用前一种表示法,您会发现自己陷入了一个永无止境的警报“覆盖”循环。

【讨论】:

    【解决方案2】:
    1. 函数定义
    2. 函数字面量赋值

    唯一的区别是在某些情况下您可以立即访问前者,而您必须等待后者的分配。

    不要在 firebug 控制台/解释器中运行它来测试它,而是在真正的 html 页面上测试。

    say('spotted');
    function say(msg){ alert(msg) }
    

    上面的方法可以,但是如果你在下面用var say = function(){} 定义了一个函数字面量,它会抱怨它还没有定义。

    【讨论】:

    • 不,这不是唯一的区别——我认为 Rob Levine 的回答突出了一个重要的区别。
    【解决方案3】:

    在第一个示例中,您定义了一个命名函数——该函数将始终以该名称为人所知。定义具有相同名称的不同函数将是错误的(除非您直接分配给 window 属性)。在第二个示例中,您定义了一个匿名函数并将其分配为变量的值。您可以稍后根据需要将变量的值更改为任何其他函数;当然,除非您将其存储在其他位置,否则在此过程中会丢失对匿名函数的任何引用。所以,在这两种情况下,你并不是真的在做同样的事情,尽管如果你愿意,你可以这样对待它——并确保在第二种情况下使用它之前定义函数,尽管这更像是一个变量函数而不是函数本身。

    【讨论】:

      【解决方案4】:

      使用Function(){} 样式定义的函数在整个程序中都可用,而不必在代码中比调用它们的位置更早地定义。我相信这叫做“吊装”。

      这样就可以了

      cow('spotted');
      function cow(color){ return 'cow is '+color; }
      

      但这会引发错误

      cow('spotted');//cow isn't defined yet!
      var cow=function(color){ return 'cow is '+color; }
      

      【讨论】:

        【解决方案5】:

        就函数而言,它们的行为是相同的。

        更多详情请看这里:http://javascript.about.com/library/blfunc.htm

        【讨论】:

          【解决方案6】:

          你可以根据情况使用,两者都成为window对象的方法。后者称为匿名函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-21
            • 1970-01-01
            • 2011-06-27
            • 2013-08-07
            • 2020-08-13
            • 2020-01-12
            相关资源
            最近更新 更多