[英]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 = b
將b
的名稱設置為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.