[英]How does an anonymous function know its name?
考慮以下代碼。
const foo = () => {}; console.log(foo.name); // prints foo const bar = foo; console.log(bar.name); // prints foo again
請指出我對語句const foo = () => {};
. 表達式() => {}
計算結果為匿名 function object 並且該語句將名稱foo
綁定到該 object。 當然,表達式() => {}
的值不知道它的name
foo
,但是在foo
綁定到它之后它以某種方式知道。 但這是怎么發生的? 我假設=
不會改變右側,並且第 3 行和第 4 行的行為符合我的預期。
根據規范,當評估變量聲明並且初始化程序是匿名 function 定義時,該定義以特殊方式評估,傳遞要用作 function 名稱的變量名稱:
LexicalBinding : BindingIdentifier初始化器
1. 讓bindingId為BindingIdentifier的StringValue 。
2.讓lhs成為! ResolveBinding ( bindingId )。
3. 如果IsAnonymousFunctionDefinition ( Initializer ) 為true
,則
一個。 讓價值存在? 帶有參數bindingId的Initializer的NamedEvaluation 。
...
在評估賦值表達式時會發生類似的事情。
從技術上講,您的代碼的第 1 行不是匿名 function,而是“隱式命名” function 表達式(或者正如 mdn 也稱之為“未命名函數”)。
來自 mdn:
分配了 function 表達式的變量將具有 name 屬性。 如果將其分配給不同的變量,則名稱不會更改。 如果 function 名稱被省略,它將是變量名稱(隱式名稱)。 如果 function 名稱存在,它將是 function 名稱(顯式名稱)。 這也適用於箭頭函數(箭頭沒有名稱,因此您只能給變量一個隱式名稱)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.