为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森林海 2021-04-16 13:14:43
通常,在Javascript中,当我想将匿名/内联函数作为参数传递给另一个函数时,请执行以下操作之一。someFunctionCall(function() {    //...});someFunctionCall( () => {    //...});但是,我最近继承了一个使用命名函数作为内联参数的代码库,如下所示someFunctionCall(function foo() {    //...});我以前从未见过这种语法。该函数似乎仍然是匿名的-foo在调用范围或被调用范围中都没有定义函数。这仅仅是样式问题,还是可以使用命名函数(foo上述)作为匿名函数来更改该程序的行为或状态?这是专门针对NodeJS(不是基于浏览器的程序)程序的,并且我对使用函数作为参数的特定行为特别感兴趣。也就是说,欢迎跨平台和运行时提供来自行为的信息。
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

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

  • 由于函数名称显示在调用层次结构中,因此使调试更加容易。

  • 在函数的内部范围中可以访问函数名称,因此可以将其用于递归

  • 函数名称本身就像函数执行的自我文档一样,而不是阅读代码。


查看完整回答
反对 回复 2021-04-29
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-04-29
?
GCT1015

TA贡献1827条经验 获得超4个赞

我举一个例子

情况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)值将为1。

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

在情况1中,如果要使其与lamba一起使用,则必须使用obj.count + = 1,并且名称具有引用。

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


查看完整回答
反对 回复 2021-04-29
  • 3 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信