匿名函数如何知道它的名字?

How does an anonymous function know its name?

提问人:lamc 提问时间:9/22/2022 最后编辑:lamc 更新时间:9/22/2022 访问量:98

问:

请考虑以下代码。

const foo = () => {};
console.log(foo.name); // prints foo
const bar = foo;
console.log(bar.name); // prints foo again

请指出我对这句话的推理有什么问题.表达式的计算结果为匿名函数对象,语句将名称绑定到该对象。当然,表达式的值不知道它有,但不知何故,它知道之后与它绑定。但这是怎么发生的呢?我假设这不会改变右侧,并且第 3 行和第 4 行的行为符合我的预期。const foo = () => {};() => {}foo() => {}namefoofoo=

JavaScript 第一类函数

评论

2赞 Rory McCrossan 9/22/2022
因为这些不是匿名函数,所以它们是函数表达式。以下是有关差异的一些进一步阅读: stackoverflow.com/q/336859/519413
2赞 romellem 9/22/2022
是的,它从句法位置推断出它的名字。因此,在刚刚创建的函数上设置属性。当您重新分配引用时,已经设置好了,这就是 .查看 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...const foo = () => {}.name.nameconst bar = foobar.name === 'foo'

答:

3赞 Felix Kling 9/22/2022 #1

根据规范,当一个变量声明被计算并且初始值设定项是一个匿名函数定义时,该定义将以一种特殊的方式被计算,传递要用作函数名的变量的名称:

LexicalBindingBindingIdentifier 初始值设定项
1。设 bindingIdBindingIdentifierStringValue
2. 让 lhs 成为 !ResolveBindingbindingId)。
3. 如果 IsAnonymousFunctionDefinitionInitializer) 是 ,则
a.让值是 ?NamedInitializerEvaluation,参数为 bindingId
true

在计算赋值表达式时也会发生类似情况。

1赞 Sean Sutherland 9/22/2022 #2

从技术上讲,代码的第 1 行不是一个匿名函数,它是一个“隐式命名”的函数表达式(或者正如 mdn 所说的那样,一个“未命名的函数”)。

从 mdn:

函数表达式分配到的变量将具有 name 属性。如果将名称分配给其他变量,则名称不会更改。如果省略函数名称,则它将是变量名称(隐式名称)。如果存在函数名称,则它将是函数名称(显式名称)。这也适用于箭头函数(箭头没有名称,因此您只能为变量提供隐式名称)。

另请参阅:Function.name#function_expression