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

ES2015 函数名称推断在哪里定义?

ES2015 函数名称推断在哪里定义?

蛊毒传说 2022-01-07 16:22:12
我目睹了这种行为,后来发现了匿名函数(最显着的是新箭头函数)的“名称推断”的概念,但我无法找到这种行为的定义位置。以供参考:// Arrow functions are inherently anonymous so this shouldn't workconst foo = () => {};console.log(foo.name); // outputs "foo"const bar = function() {};console.log(bar.name); // outputs "bar"// vsconsole.log((() => {}).name) // outputs ""console.log((function() {}).name) // outputs ""我发现的最接近的东西是在MDN 上,它把它归因于“ECMAScript 2015 中的新功能”。我试图搜索ES2015 规范,但没有成功。这似乎是现代 ES 的一个很大程度上未知但有用的功能,实际上几乎没有文档存在。任何人都可以为此提供规范规范的参考吗?
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

Function Objects 下,您将找到该name属性。

使用SetFunctionName抽象操作将上下文名称分配给该属性,并在规范中的不同位置调用:

1) 在对象字面量内的属性声明处{ a: b }将名称设置为bto a,如果b是匿名函数)。

2)在赋值时,(a = bb的名称设置为aifa直接是一个标识符并且b也是一个匿名函数)。

3) 内部对象解构默认值{ a = b } =bs 名称设置为aifb是匿名函数)。

4)内部函数参数解构类似于3)。

5) 在变量声明处与 2) ( let a = b; const a = b; var a = b;)类似。

6) 在函数声明处(包括生成器函数function a() { })。

7) 在对象方法中,getter(以“get”为前缀)和 setter(以“set”为前缀){ a() { }, get a() {}, set a() {} })。

8) 在class声明表达式处class a {})。

9)绑定函数时,被绑定的函数会接管要绑定的函数名,前缀为“bound”。

请注意,如果出于安全考虑存在计算键或对象属性分配,则不会分配名称。


查看完整回答
反对 回复 2022-01-07
?
烙印99

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

函数的.name属性是在SetFunctionName过程中创建的,该过程在整个规范中的各个地方都被调用,通常当您分配变量或定义属性时,右侧是匿名函数表达式。

另请参阅ECMAScript 6 的 function.name 属性赋值表达式中 name 属性的定义以及为什么 `obj.foo = function() { };` 不将名称 `foo` 分配给函数?进行更多讨论。


查看完整回答
反对 回复 2022-01-07
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

@asdfgerte 获胜(最初)(我认为我不能授予评论作为答案)。在规范中找到但未命名为“名称推断” http://www.ecma-international.org/ecma-262/6.0/index.html#sec-assignment-operators-runtime-semantics-evaluation


查看完整回答
反对 回复 2022-01-07
  • 3 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

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