2010-07-13 80 views
4

可能重复:
Javascript: var functionName = function() {} vs function functionName() {}这两种在JavaScript中定义函数的方式有什么区别?

方法1:

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

方式2:

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

我用的是前者,当我”我只是定义了一个“常规”函数,我将使用一次或多次,后者当我通过它回调另一个函数左右时,但它看起来在两种方式都工作正常。

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

+1

这里已经有好几次很好的回答了。只需搜索谷歌或stackoverflow。 – Anurag 2010-07-13 15:52:34

+2

http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname and http://stackoverflow.com/questions/1925976/declaring-functions-in-javascript-closed – Anurag 2010-07-13 16:00:11

+0

谢谢你,@Anurag。我已经选择了一个关闭它的答案。我将来会更加谨慎。 – 2010-07-13 16:08:04

回答

2

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

这可以让你实现后者无法实现的行为;如下面的技巧来“覆盖”现有的功能,然后调用“基地”:

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

var original = myOriginalFunction; 

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

myOriginalFunction(); 

这给你一个警告“重写”,随后警报“原始”。

但是,如果您尝试使用前面的符号,您会发现卡住了警告“overidden”的永无止境的循环。

0

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

2
  1. 函数定义
  2. 功能字面分配

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

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

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

以上的工作,但如果你定义的字面下面var say = function(){}一个函数,它会抱怨它尚未确定。

+0

不,这不是唯一的区别 - 我认为罗布莱文的答案突出了一个重要的问题。 – 2010-07-13 16:15:17

0

功能,可在程序可供选择,而不必被前面的代码比他们被称为地方定义。我相信这叫做'提升'。

所以此工程

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

但是这将引发一个错误

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

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

相关问题