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

What's the difference between this two ways of defining a function in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Javascript: var functionName = function() {} vs function functionName() {}

方式1:

1
2
3
function fancy_function(){
    // Fancy stuff happening here
}

方式二:

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

在使用类的时候,我只是一个"正常"的defining功能中,我会使用一个或several时报》和《笑当我通过它的另一个回调或社会功能,但它看起来工作的方式都好。

它是一个真的离差一些的方式吗?


函数本身没有区别,但是后者给了您更多的灵活性,因为您引用了函数,并且如果被覆盖,它的行为方式也不同。

这允许您使用后者实现您无法使用前者实现的行为;例如下面的技巧"覆盖"现有函数,然后调用"基础":

1
2
3
4
5
6
7
8
9
10
11
12
var myOriginalFunction = function() {
    window.alert("original");
}

var original = myOriginalFunction;

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

myOriginalFunction();

这将给您一个"已覆盖"的警报,然后是一个"原始"警报。

然而,如果你用以前的符号来尝试这个,你会发现你陷入了一个永无止境的警报循环"overidden"。


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


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

    不要在Firebug控制台/解释器中运行它来测试它,而应该在真正的HTML页面上进行测试。

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

    上面的内容是可行的,但是如果您使用下面的var say = function(){}定义了一个函数文字,它会抱怨它还没有定义。


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

    所以这个作品

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

    但这会引发一个错误

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

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

    有关详细信息,请参阅此处:http://javascript.about.com/library/blfunc.htm


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