ES6に細い矢印の機能がないのはなぜですか?


16

ES6はファットアロー関数(=>)を追加しました。これには、通常の関数とは2つの大きな違いがあります。

  • 短い構文(単一式の本体を使用する場合の暗黙的な戻りを含む)
  • this周囲のスコープから継承する

これらは両方とも非常に便利な機能ですが、その価値とアプリケーションは完全に分離されているように見えます。私が短い構文の機能を使用したい場合は、私がいることを奇妙に思える持っても使用するthis-modifying行動を。およびその逆。これら2つの機能が言語への単一の追加として実装されている理由はわかりません。

暗黙の戻り値と簡潔さのために短い構文関数を使用したい場合(完全なものfunction (..) { return ...}が少し読みにくいコンテキストで)、this呼び出し側のコンテキストを参照するために関数で使用したいのですが?これを行う方法はありません。

CoffeeScriptにはスタイル->=>スタイルの両方の機能があり、明らかにES6 =>はそこからスタイルを借用しているようです。私の質問は、なぜES6も->スタイルを取り入れなかったのですか?


ファットアロー関数には、バインドできないなど、他の違いargumentsもあります。
DeadMG

周囲のスコープだけが必要な場合はthis、完全な関数宣言でクロージャーにいつでもバインドできます。これはあなたが心配している部分ではないかもしれません。
ベン

回答:


25

矢印関数を追加する提案を参照してくださいhttp : //wiki.ecmascript.org/doku.php?id=harmony : arrow_function_syntax 1

それが言うことは:

ただし、CoffeeScriptの->は必要ありません。2本の矢印があり、このバインディングが頻繁に発生するフットガンであるため、動的にバインドするのは混乱します。

また、->構文を使用した以前のバージョンの提案についても説明しています。https//esdiscuss.org/topic/arrow-function-syntax-simplified

次のようになります。

  1. セマンティクスがわずかに異なる2つの矢印構文があると、複雑さと混乱が増大します。
  2. function()のこの動的バインディングは->、めったに役に立たないと見なされ、フットガンになりました。
  3. 動的なこのバインディングが本当に必要な場合は、まだfunction()を使用できますが、ショートカット構文はあまり役に立ちませんでした。

1
+1。特に、ES6はこれらの機能を導入する2番目の試みであり、当初ES4に含める予定でしたが、主要な利害関係者が複雑すぎて後方互換性を損なう可能性があると考えられることが明らかになったため、仕様は破棄されました。すべてを可能な限りシンプルにすることは、今回の委員会にとって重要な目標だったに違いありません。
ジュール

1
答えてくれてありがとう、しかしそれがそれをカバーするとは思わない。少ないということは単純なことではありません。異なるthis-bindingロジックを取得するためだけに、2つの非常に異なる関数構文を切り替える必要がある(単一の文字を切り替えるのに比べて)より複雑だと思います。「セマンティクスが異なる複数のタイプの関数」を持つことは、ひどい考えではありません。それはまさに私たちが実際に持っているものです。そして、私たちが話していることと後方互換性が何の関係があるのか​​わかりません。それはあなたが何を意味するかだ場合、私は、彼らは古典的な機能の構文については削除をサポートしている必要があり示唆ないよ
して、Callum

2
@callum、コンセンサス(少なくともこの決定を下している人々の間)は、function()このスタイルはこのバインディングが間違いであり、言語のいぼであるというスタイルです。可能であれば、セマンティクスfunction()を持つように変更されます=>が、下位互換性が損なわれるため変更できません。
ウィンストンイーバート

2
@WinstonEwertは固執します。決定を下す人々は、周囲のスコープfunction()から継承するthisように変更できるなら、それを好むと言って=>いましたか?その場合、thisどこでもグローバルオブジェクトを参照するだけではありませんか?奇妙に聞こえます。どこで聞いた?
コールム

3
これには受け入れられた答えがあるかもしれませんが、それは貧弱な言語設計のようです。太い矢印が必要な言語がある場合は、細い矢印も使用できるはずです。前者はすべての人にオブジェクトの観点から考え始めることを強制しますが、後者は機能設計のjavascriptの履歴と遅延コンテキストを最初に認めます。
コア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.