这两种在 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 中定义函数的方式有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC 控制器和RestFul

javascript函数篇函数声明提升

JavaScript函数的两种声明方式

JavaScript函数的两种声明方式

C ++类构造函数设置变量这两种方式有啥区别?

C ++:这两种将数字写入矩阵的方式之间在速度上有显着差异吗?