什么';这两种在JavaScript中定义函数的方法有什么区别?

什么';这两种在JavaScript中定义函数的方法有什么区别?,javascript,Javascript,可能重复: 方式1: function fancy_function(){ // Fancy stuff happening here } 方式2: var fancy_function = function(){ // Fancy stuff happening here, too. } 我在定义一个“普通”函数时使用前者,我将使用一次或多次,而在向它传递另一个函数的回调时使用后者,但这两种方法看起来都很好 这在某种程度上真的有区别吗?您可以根据情况使用这两种方法中的任何

可能重复:

方式1:

function fancy_function(){
    // Fancy stuff happening here
}
方式2:

var fancy_function = function(){
    // Fancy stuff happening here, too.
}
我在定义一个“普通”函数时使用前者,我将使用一次或多次,而在向它传递另一个函数的回调时使用后者,但这两种方法看起来都很好


这在某种程度上真的有区别吗?

您可以根据情况使用这两种方法中的任何一种,这两种方法都可以成为
窗口
对象的方法。后者称为匿名函数

  • 函数定义
  • 函数文字赋值
  • 唯一的区别是,在某些情况下,您可以立即访问前者,而您必须等待后者的分配

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

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

    上述方法可行,但如果您使用下面的
    var say=function(){}
    定义了一个函数文字,它会抱怨它尚未定义。

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


    有关更多详细信息,请参见此处:

    使用
    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; }
    

    在第一个示例中,您定义了一个命名函数——该函数总是以该名称命名的。使用相同的名称定义不同的函数将是一个错误(除非直接指定给窗口属性)。在第二个示例中,您定义了一个匿名函数,并将其指定为变量的值。您可以在以后根据需要将变量的值更改为任何其他函数;当然,在进程中丢失对匿名函数的任何引用,除非您将其存储在其他位置。因此,在这两种情况下,你并不是在做同样的事情,尽管如果你愿意,你可以这样对待它——并且确保在第二种情况下使用函数之前定义它,尽管它更多的是一个变量函数而不是函数本身。

    函数本身没有区别,但是后者给了您更多的灵活性,因为您有一个对函数的引用,并且它在被覆盖时的行为是不同的

    这使你能够与后者达成你无法与前者达成的行为;例如以下技巧“覆盖”现有函数,然后调用“基”:

    这将为您提供一个“已覆盖”警报,然后是一个“原始”警报


    但是,如果您尝试使用前一种表示法,您会发现您陷入了一个永不结束的警报循环“overidden”。

    这里已经有好几次回答了这个问题。只需在google或stackoverflow上搜索即可。谢谢你,阿努拉格。我已经选择了一个答案来关闭这个。我以后会更加小心。@Eric-别担心。我的观点是,链接的文章已经存在很久了,并且包含了一些经过深思熟虑的答案。在15分钟内,很难找到一个经过深思熟虑、编辑、冗长精炼的答案。不,这不是唯一的区别——我认为罗布·莱文的答案突出了一个重要的区别。
    var myOriginalFunction = function() {
        window.alert("original");
    }
    
    var original = myOriginalFunction;
    
    var myOriginalFunction = function() {
        window.alert("overridden");
     original();
    }
    
    myOriginalFunction();