2016-04-08 15 views
2

ECMAScript 6以降、ほとんどの関数オブジェクトには、という名前のプロパティが定義されています()。代入式の名前プロパティの定義

ここで、匿名関数式が変数に割り当てられている場合、またはオブジェクト初期化子内のプロパティ定義の一部である場合、変数の識別子またはプロパティの名前は、の名前の値になります。関数オブジェクト

次の例のように、左側のメンバーの表現への割り当てがない理由、私はこの動作の文書化セマンティックに関する仕様を理解するために問題はありませんが、私は実際に見ることができない
const a = function() {}; 
console.log(a.name); // a 

const object = { 
    b : function() {} 
}; 
console.log(object.b.name); // b 

その機能のプロパティに影響します。

const object = {}; 
object.c = function() {}; 
console.log(object.c.name); // 

部材式の一部として、(とする必要がありますか?)はプロパティの値として使用することができるindentifierが明らかに存在します。たとえオブジェクト名の中で計算されたプロパティ名を使用しても、という名前の無名関数のプロパティーが定義されることはないため、プロパティ名は大括弧で囲まれた式であっても問題ありません。

観察された動作が仕様に準拠していることを誰かが確認できる場合は、この構文に適用される特定のセマンティクスを簡単に説明してください。

+1

はい、これは仕様の変わった部分です。正しく読んだことがあります。 https://esdiscuss.org/topic/name-anonymous-functions-on-property-assignments – Bergi

+1

こんにちはベルギー。リンク(*とリンク*のリンク)をありがとう。今私は 'IsIdentifierRef'を誤解していないことが分かります。私はちょうどそのことについて確信が持たれておらず、いくつかの確認を求めました。なぜなら、この議論の中で言及したように、このことから生じる行動は私にとってまったく矛盾するように思えたからです。残念ながら、ES 2017は[this](https://tc39.github.io/ecma262/#sec-static-semantics-static-semantics-isidentifierref)についても何も変えていないようです。 :-( – SickBoy

答えて

1

この最初のスニペットは、assignment operators下に記載されている:

E。 LeftHandSideExpressionのIsAnonymousFunctionDefinition(AssignmentExpression)とIsIdentifierRefの両方がtrueの場合、

i。 hasNamePropertyをHasOwnProperty(rval、 "name")にします。

ii。 ReturnIfAbrupt(hasNameProperty)。

iii。 hasNamePropertyがfalseの場合は、SetFunctionName(rval、GetReferencedName(lref))を実行します。

最後のスニペットのようにMemberExpressionに割り当てると、IsIdentifierRef(LeftHandSideExpression)はfalseであり、変換は行われません。

IsAnonymousFunctionDefinitionの標準を検索すると、このロジックが使用される他のケースが2つ見つかります(オブジェクト初期化子、割り当て解除の割り当て)。

IsIdentifierRefは(herehere)で2回定義され、両方の定義がIdentifierReferenceIdentifieryieldものであり、「式がtrueを返すIdentifierReferenceあればそうでない場合はfalseを返す」非厳密との下位互換性のためであるまで沸騰さコード)。

+0

こんにちはgeorgと答えてくれてありがとうございます。私は既にあなたが投稿したアルゴリズムステップを見つけました。このケースでは 'IsAnonymousFunctionDefinition(AssignmentExpression)'がtrueを返すはずですが、わかりやすく、なぜIsIdentifierRef '識別子が取り出せても偽を返します。 – SickBoy

+0

私は最終的にそれを得ました:-)それは一貫した行動を起こさないように思われたので、私は確信していませんでしたおそらく、この場合に適用される*隠されたルール*を見落としているかもしれません。事を明確にするために、あなたとBergiにもう一度感謝します! – SickBoy

関連する問題