亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號