提问人:lamc 提问时间:9/22/2022 最后编辑:lamc 更新时间:9/22/2022 访问量:98
匿名函数如何知道它的名字?
How does an anonymous function know its name?
问:
请考虑以下代码。
const foo = () => {};
console.log(foo.name); // prints foo
const bar = foo;
console.log(bar.name); // prints foo again
请指出我对这句话的推理有什么问题.表达式的计算结果为匿名函数对象,语句将名称绑定到该对象。当然,表达式的值不知道它有,但不知何故,它知道之后与它绑定。但这是怎么发生的呢?我假设这不会改变右侧,并且第 3 行和第 4 行的行为符合我的预期。const foo = () => {};
() => {}
foo
() => {}
name
foo
foo
=
答:
根据规范,当一个变量声明被计算并且初始值设定项是一个匿名函数定义时,该定义将以一种特殊的方式被计算,传递要用作函数名的变量的名称:
LexicalBinding:BindingIdentifier 初始值设定项
1。设 bindingId 为 BindingIdentifier 的 StringValue。
2. 让 lhs 成为 !ResolveBinding(bindingId)。
3. 如果 IsAnonymousFunctionDefinition(Initializer) 是 ,则
a.让值是 ?NamedInitializer 的 Evaluation,参数为 bindingId。
。true
在计算赋值表达式时也会发生类似情况。
从技术上讲,代码的第 1 行不是一个匿名函数,它是一个“隐式命名”的函数表达式(或者正如 mdn 所说的那样,一个“未命名的函数”)。
从 mdn:
函数表达式分配到的变量将具有 name 属性。如果将名称分配给其他变量,则名称不会更改。如果省略函数名称,则它将是变量名称(隐式名称)。如果存在函数名称,则它将是函数名称(显式名称)。这也适用于箭头函数(箭头没有名称,因此您只能为变量提供隐式名称)。
评论
const foo = () => {}
.name
.name
const bar = foo
bar.name === 'foo'