簡體   English   中英

ES2015 function 名稱推斷在哪里定義?

[英]Where is ES2015 function name inference defined?

我目睹了這種行為,后來發現了匿名函數(最顯着的是新的箭頭函數)的“名稱推斷”概念,但我無法找到這種行為的定義位置。 以供參考:

// 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 規范,但沒有成功。 這似乎是現代 ES 的一個很大程度上未知但有用的功能,實際上幾乎沒有文檔存在。

任何人都可以為此提供規范規范的參考嗎?

Function 對象下,您將找到name屬性。

使用SetFunctionName抽象操作為該屬性分配上下文名稱,並在規范中的不同位置調用:

1) 在 object 文字內的屬性聲明處(如果b是匿名函數, { a: b }b的名稱設置為a )。

2)在assignments中,(如果a直接是標識符並且b也是匿名的 function,則a = bb的名稱設置為a )。

3) 在 object 內部解構默認值(如果b是匿名函數, { a = b } =b的名稱設置為a )。

4) 內部function 參數解構與 3) 類似。

5) 在變量聲明處類似於 2) ( let a = b; const a = b; var a = b; )。

6)在function 聲明(包括生成器函數function a() { } )。

7) 在object 方法中,getter(以“get”為前綴)和 setter(以“set”為前綴){ a() { }, get a() {}, set a() {} } )。

8) 在class聲明表達式( class a {} )。

9) 綁定函數時,被綁定的 function 接管 function 的名稱以綁定前綴為“綁定”。

請注意,如果出於安全考慮,存在計算密鑰或 object 屬性分配,則不會分配名稱。

該函數的.name屬性是在SetFunctionName過程中創建的,該過程在整個規范中的各個位置都被調用,通常在您分配變量或定義屬性時,右側是匿名 function 表達式。

另請參閱ECMAScript 6 的 function.name 屬性賦值表達式中名稱屬性的定義以及為什么 `obj.foo = function() { };` 不將名稱 `foo` 分配給 function? 進行更多討論。

@asdfgerte 獲勝(最初)(我認為我不能授予評論作為答案)。 在規范中找到但未命名為“名稱推斷” http://www.ecma-international.org/ecma-262/6.0/index.html#sec-assignment-operators-runtime-semantics-evaluation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM