命名和未命名匿名 Javascript 函数之间的差异

Differences Between Named and Unnamed Anonymous Javascript Functions

提问人:Alana Storm 提问时间:4/13/2019 最后编辑:Alana Storm 更新时间:4/14/2019 访问量:614

问:

通常,在 Javascript 中,当我想将匿名/内联函数作为参数传递给另一个函数时,我会执行以下操作之一。

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

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

但是,我最近继承了一个使用命名函数作为内联参数的代码库,如下所示

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

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

这是专门针对 NodeJS(不是基于浏览器的程序)程序的,我对使用函数作为参数的特定行为特别感兴趣。也就是说,欢迎来自跨平台和运行时行为的信息。

JavaScript 节点 .js 闭包 匿名函数 函数表达式

评论

3赞 Jared Smith 4/13/2019
堆栈跟踪。如果回调引发,该名称将显示在跟踪中。至少在浏览器中,没有在 node 中测试过。
2赞 Alana Storm 4/13/2019
TFW:你突然意识到,你不这样做会给其他开发人员带来可避免的地狱。谢谢!
1赞 Sushanth -- 4/13/2019
此外,函数名称将充当自我文档
1赞 dandavis 4/13/2019
还可以将它们用作状态的持久性但非全局对象存储。(function me(x){ me.lastX=x; })
1赞 Mark Schultheiss 4/13/2019
另外,我建议您了解函数和函数表达式之间的区别 - 它们看起来相同,但并不完全相同。

答:

2赞 Anatol - user3173842 4/13/2019 #1

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

8赞 Sushanth -- 4/13/2019 #2

使用命名函数表达式而不是匿名函数表达式至少有三个优点。

  • 使调试更容易,因为函数名称显示在调用层次结构中。
  • 函数名称可在函数的内部作用域中访问,因此可用于递归
  • 函数名称本身就像函数正在执行的操作的自我文档,而不是读取代码。
-1赞 Nandan 4/13/2019 #3

我举个例子

案例一:

var obj =  {count: 0, counter: ()=> {this.count+=1;}}

如果你做console.log(obj.count),你会得到0

案例二:

var obj  = {count: 0, counter (){this.count+=1;}}

在第二种情况下,如果您执行控制台.log(obj.count),值将为1。

希望你现在明白了。Lamda 表达式无法访问引用此对象的值。它只能访问具有全局引用的变量。

在情况 1 中,如果你想让它与 lamba 一起工作,你必须使用 obj.count+=1 和 name has reference。

而其余的 JavaScript 函数实现保持不变,没有太大区别。