11

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

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

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

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

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

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

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

4

3 回答 3

8

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

  • 由于函数名称显示在调用层次结构中,因此使调试更容易。
  • 函数名在函数的内部范围内是可访问的,因此可以用于递归
  • 函数名本身就像一个函数正在做什么的自我文档,而不是阅读代码。
于 2019-04-12T18:36:53.047 回答
2

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

于 2019-04-12T18:27:21.423 回答
0

我举个例子

情况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) 值将是一。

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

如果你想让它与 lba 一起工作,你必须使用 obj.count+=1 并且名称有参考。

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

于 2019-04-12T19:45:49.430 回答