命名和未命名匿名函数之间的差异 Javascript
Differences Between Named and Unnamed Anonymous Javascript Functions
通常,在 Javascript 中,当我想将一个 anonymous/inline 函数作为参数传递给另一个函数时,我会执行以下操作之一。
someFunctionCall(function() {
//...
});
someFunctionCall( () => {
//...
});
但是,我最近继承了一个代码库,它使用 named 函数作为内联参数,像这样
someFunctionCall(function foo() {
//...
});
我以前从未见过这种语法。该函数仍然似乎 是匿名的——在调用或被调用范围内都没有定义foo
函数。这只是风格问题,还是可以使用命名函数(上面的foo
)作为匿名函数来改变该程序的行为或状态?
这是专门针对 NodeJS(不是基于浏览器的程序)程序的,我对使用函数作为参数的特定行为特别感兴趣。那就是欢迎来自跨平台和运行时行为的信息。
使用那些 "named anonymous functions" 不会改变行为,但会在堆栈跟踪中显示函数名称,这非常有用。同样,该函数可以通过这种方式在自身内部调用。
使用命名函数表达式而不是匿名函数表达式至少有三个优点。
- 函数名称显示在调用层次结构中,使调试更容易。
- 函数名在函数的内部作用域内是可访问的,因此可以用于递归
- 函数名称本身就像是函数正在做什么的自我文档,而不是阅读代码。
我举个例子
案例一:
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 表达式无法访问引用此对象的值。它只能访问具有全局引用的变量。
在情况 1 中,如果你想让它与 lamba 一起工作,你必须使用 obj.count+=1 名称有参考。
其余JavaScript函数实现保持不变,没有太大区别。
通常,在 Javascript 中,当我想将一个 anonymous/inline 函数作为参数传递给另一个函数时,我会执行以下操作之一。
someFunctionCall(function() {
//...
});
someFunctionCall( () => {
//...
});
但是,我最近继承了一个代码库,它使用 named 函数作为内联参数,像这样
someFunctionCall(function foo() {
//...
});
我以前从未见过这种语法。该函数仍然似乎 是匿名的——在调用或被调用范围内都没有定义foo
函数。这只是风格问题,还是可以使用命名函数(上面的foo
)作为匿名函数来改变该程序的行为或状态?
这是专门针对 NodeJS(不是基于浏览器的程序)程序的,我对使用函数作为参数的特定行为特别感兴趣。那就是欢迎来自跨平台和运行时行为的信息。
使用那些 "named anonymous functions" 不会改变行为,但会在堆栈跟踪中显示函数名称,这非常有用。同样,该函数可以通过这种方式在自身内部调用。
使用命名函数表达式而不是匿名函数表达式至少有三个优点。
- 函数名称显示在调用层次结构中,使调试更容易。
- 函数名在函数的内部作用域内是可访问的,因此可以用于递归
- 函数名称本身就像是函数正在做什么的自我文档,而不是阅读代码。
我举个例子
案例一:
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 表达式无法访问引用此对象的值。它只能访问具有全局引用的变量。
在情况 1 中,如果你想让它与 lamba 一起工作,你必须使用 obj.count+=1 名称有参考。
其余JavaScript函数实现保持不变,没有太大区别。