什么';这两种在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.
}
我在定义一个“普通”函数时使用前者,我将使用一次或多次,而在向它传递另一个函数的回调时使用后者,但这两种方法看起来都很好
这在某种程度上真的有区别吗?您可以根据情况使用这两种方法中的任何一种,这两种方法都可以成为
窗口
对象的方法。后者称为匿名函数
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();