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

我亲眼目睹了这种行为,后来发现了匿名函数(最著名的是新箭头函数)的“名称推断”概念,但是我无法找到该行为的定义位置。供参考:

// Arrow functions are inherently anonymous so this shouldn't work
const foo = () => {};
console.log(foo.name); // outputs "foo"
const bar = function() {};
console.log(bar.name); // outputs "bar"

// vs

console.log((() => {}).name) // outputs ""
console.log((function() {}).name) // outputs ""

我在MDN上找到的最接近的东西将其归因于“ ECMAScript 2015中的新增功能”。我尝试搜索ES2015 spec时不走运。这似乎是现代ES的一个鲜为人知但有用的功能,而实际上几乎没有文档。

有人可以为此提供规范参考吗?

xiazai1999 回答:ES2015函数名称推断在哪里定义?

功能对象下,您会找到name属性。

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

1)在对象文字的property declarations内部(如果{ a: b }是匿名函数,ba的名称设置为b)。

2)在assignments,如果a = b是直接标识符,而ba,则ab的名称设置为{ a = b } =也是一个匿名函数)。

3)内部对象destructuring default values(如果b是匿名函数,a会将b的名称设置为let a = b; const a = b; var a = b;)。

4)位于function parameter destructuring内,类似于3)。

5)位于variable declarations,类似于2)(function a() { })。

6)位于function declarations(包括generator functions{ a() { },get a() {},set a() {} })。

7)位于object methods,getters (prefixed with "get") and setters (prefixed with "set")class a {})。

8)在class declarationsexpressions({{1}})。

9)当binding functions时,绑定函数将接管要绑定的函数名称,前缀为“ bound”。

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

,

该函数的.name属性是在SetFunctionName procedure中创建的,通常在规范中的各个地方都会调用该ECMAScript 6's function.name property,通常,当您分配变量或定义属性并且右侧是匿名时函数表达式。

有关更多讨论,另请参见Definition of name property in assignment expressionWhy does `obj.foo = function() { };` not assign the name `foo` to the function?OAuth Authorization Code grant

,

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

本文链接:https://www.f2er.com/3055072.html

大家都在问