命名和未命名的匿名JavaScript函数之间的区别

11

通常情况下,在JavaScript中,当我想将匿名/内联函数作为参数传递给另一个函数时,我会采取以下方法之一。

someFunctionCall(function() {
    //...
});

someFunctionCall( () => {
    //...
});

但是,最近我继承了一个代码库,其中使用了命名函数作为内联参数,就像这样

someFunctionCall(function foo() {
    //...
});

我以前从未见过这种语法。该函数仍然似乎是匿名的——在调用范围或被调用范围中都没有定义foo函数。这只是一种风格问题,还是使用命名函数(如上面的foo)作为匿名函数会改变程序的行为或状态?

这是专门针对NodeJS(而不是基于浏览器的程序),我特别关心使用函数作为参数时的特定行为。尽管如此,来自跨平台和运行时的信息也是受欢迎的。


3
堆栈跟踪。如果回调函数抛出异常,名称将显示在跟踪中。至少在浏览器中是如此,在Node中尚未测试。 - Jared Smith
2
当你突然意识到自己因为没有做这个而给其他开发人员带来了可避免的麻烦时,你会有一种深深的感觉。谢谢! - Alana Storm
1
此外,函数名称也可以像自我文档一样发挥作用。 - Sushanth --
1
你可以将它们用作持久但非全局的对象存储状态。(function me(x){ me.lastX=x; }) - dandavis
1
此外,我建议您了解函数和函数表达式之间的区别 - 它们看起来有点相似,但并不完全相同。 - Mark Schultheiss
显示剩余2条评论
3个回答

8

使用命名函数表达式而非匿名函数表达式至少有以下三个优点:

  • 在调用层次结构中,函数名称会显示出来,从而使调试更容易。
  • 函数名称可以在函数的内部作用域中访问,因此可以用于递归。
  • 函数名称本身就像函数正在做什么的自我文档,而不是读取代码。

2
使用这些“命名的匿名函数”并不会改变行为,但会在堆栈跟踪中显示函数名称,这非常有用。此外,这种方式可以使函数在其自身内部可调用。最初的回答:使用这些“命名的匿名函数”不会改变行为,但在堆栈跟踪中显示函数名称,这很有用。此外,这种方式可以使函数在其自身内部可调用。

-1
我来举个例子 情况1:
var obj =  {count: 0, counter: ()=> {this.count+=1;}}

如果你执行 console.log(obj.count),你会得到 0。 情况二:
var obj  = {count: 0, counter (){this.count+=1;}}

在第二种情况下,如果您执行console.log(obj.count),则值将为1。
希望您现在已经理解了。Lambda表达式无法访问具有此对象引用的值。它只能访问具有全局引用的变量。
在第一种情况下,如果您想要使用lambda使其工作,您必须使用具有引用名称的obj.count + = 1。
JavaScript函数的其余实现保持不变,没有太大区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接