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

时间:2010-07-13 15:50:08

标签: javascript

  

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

方式1:

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

方式2:

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

当我只定义一个“正常”函数时,我会使用前者,我会使用一次或几次,后者当我传递一个回调另一个函数左右时,但它看起来工作两种方式都很好。

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

6 个答案:

答案 0 :(得分:2)

  1. 功能定义
  2. 功能文字作业
  3. 唯一不同的是,您可以在某些情况下立即访问前者,而您必须等待后者的分配。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

函数本身没有区别,但是后者为你提供了更多的灵活性,因为你有一个函数的引用,如果被覆盖它的行为方式不同。

这使你可以用后者实现你无法实现的行为;例如以下技巧“覆盖”现有函数然后调用“base”:

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

var original = myOriginalFunction;

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

myOriginalFunction();

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

但是,如果你用前一种表示方式尝试这种方法,你会发现你陷入了一个永无止境的警报“被覆盖”。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

就功能而言,它们的行为相同。

请点击此处了解详情:http://javascript.about.com/library/blfunc.htm

答案 5 :(得分:0)

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