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

问题描述 投票:11回答:3

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

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

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

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

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

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

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

javascript node.js closures anonymous-function function-expression
3个回答
8
投票

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

  • 当函数名称显示在调用层次结构中时,可以更轻松地进行调试。
  • 函数名称可在函数的内部范围内访问,因此可用于递归
  • 函数名称本身就像是函数正在执行的自我文档而不是读取代码。

2
投票

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


0
投票

我举个例子

情况1:

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

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

案例2:

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

在第二种情况下,如果你做console.log(obj.count)值将是一个。

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

在案例1中如果你想使它与lamba一起工作,你必须使用obj.count + = 1,名称有引用。

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

© www.soinside.com 2019 - 2024. All rights reserved.