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

Posted

技术标签:

【中文标题】命名和未命名匿名 Javascript 函数之间的区别【英文标题】:Differences Between Named and Unnamed Anonymous Javascript Functions 【发布时间】:2019-09-03 13:39:44 【问题描述】:

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

someFunctionCall(function() 
    //...
);

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

不过,我最近继承了一个代码库,它使用 named 函数作为内联参数,就像这样

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

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

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

【问题讨论】:

堆栈跟踪。如果回调抛出,该名称将显示在跟踪中。至少在浏览器中,没有在node中测试过。 tfw 你突然意识到你没有这样做会导致其他开发人员陷入可避免的地狱。谢谢! 函数名也可以像一个自我记录 您也可以将它们用作状态的持久但非全局对象存储。 (function me(x) me.lastX=x; ) 另外,我建议您了解函数和函数表达式之间的区别——看起来相同但不完全一样。 【参考方案1】:

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

函数名称显示在调用层次结构中,使调试更容易。 函数名在函数内部范围内是可访问的,因此可以用于递归 函数名称本身就像一个函数正在执行的操作的自我文档,而不是阅读代码。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

我举个例子

案例 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) 值将是一。

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

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

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

【讨论】:

以上是关于命名和未命名匿名 Javascript 函数之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

声明 Javascript 命名空间的两种方式之间的区别

混合命名和未命名函数参数

当使用局部变量将匿名函数传递给命名函数时,Javascript中的范围问题

为啥将 javascript 命名空间作为一个函数?

为啥使用命名函数表达式?

使用匿名函数会影响性能吗?