这两种在 JavaScript 中定义函数的方式有啥区别? [复制]
Posted
技术标签:
【中文标题】这两种在 JavaScript 中定义函数的方式有啥区别? [复制]【英文标题】:What's the difference between this two ways of defining a function in JavaScript? [duplicate]这两种在 JavaScript 中定义函数的方式有什么区别? [复制] 【发布时间】:2011-03-15 09:53:23 【问题描述】:可能重复:javascript: var functionName = function() vs function functionName()
方式一:
function fancy_function()
// Fancy stuff happening here
方式2:
var fancy_function = function()
// Fancy stuff happening here, too.
我在定义一个“正常”函数时使用前者,我将使用一次或多次,而后者在我向它传递另一个函数的回调时使用,但它看起来可以工作两种方式都很好。
在某些方面真的有区别吗?
【问题讨论】:
这里已经多次得到很好的回答。只需在 google 或 *** 上搜索即可。 ***.com/questions/336859/… 和 ***.com/questions/1925976/… 谢谢你,@Anurag。我已经选择了一个答案来关闭它。以后我会更加谨慎。 @Eric - 不用担心。我的观点是,链接的文章已经存在了很长时间,并且包含一些经过深思熟虑的答案。很难在 15 分钟内找到一个经过深思熟虑、经过编辑、精炼的答案。 【参考方案1】:函数本身没有区别,但后者为您提供了更大的灵活性,因为您有对该函数的引用,并且在被覆盖时它的行为方式有所不同。
这使您可以通过后者实现您无法通过前者实现的行为;例如以下技巧来“覆盖”现有函数,然后调用“基础”:
var myOriginalFunction = function()
window.alert("original");
var original = myOriginalFunction;
var myOriginalFunction = function()
window.alert("overridden");
original();
myOriginalFunction();
这会为您提供“已覆盖”警报,然后是“原始”警报。
但是,如果您尝试使用前一种表示法,您会发现自己陷入了一个永无止境的警报“覆盖”循环。
【讨论】:
【参考方案2】:-
函数定义
函数字面量赋值
唯一的区别是在某些情况下您可以立即访问前者,而您必须等待后者的分配。
不要在 firebug 控制台/解释器中运行它来测试它,而是在真正的 html 页面上测试。
say('spotted');
function say(msg) alert(msg)
上面的方法可以,但是如果你在下面用var say = function()
定义了一个函数字面量,它会抱怨它还没有定义。
【讨论】:
不,这不是唯一的区别——我认为 Rob Levine 的回答突出了一个重要的区别。【参考方案3】:在第一个示例中,您定义了一个命名函数——该函数将始终以该名称为人所知。定义具有相同名称的不同函数将是错误的(除非您直接分配给 window 属性)。在第二个示例中,您定义了一个匿名函数并将其分配为变量的值。您可以稍后根据需要将变量的值更改为任何其他函数;当然,除非您将其存储在其他位置,否则在此过程中会丢失对匿名函数的任何引用。所以,在这两种情况下,你并不是真的在做同样的事情,尽管如果你愿意,你可以这样对待它——并确保在第二种情况下使用它之前定义函数,尽管这更像是一个变量函数而不是函数本身。
【讨论】:
【参考方案4】:使用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;
【讨论】:
【参考方案5】:就函数而言,它们的行为是相同的。
更多详情请看这里:http://javascript.about.com/library/blfunc.htm
【讨论】:
【参考方案6】:你可以根据情况使用,两者都成为window
对象的方法。后者称为匿名函数。
【讨论】:
以上是关于这两种在 JavaScript 中定义函数的方式有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章