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) } |
上面的内容是可行的,但是如果您使用下面的
使用
所以这个作品
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
您可以根据情况使用任意一种方法,这两种方法都成为