アロー関数
アロー関数(Arrow Functions)
アロー関数は、可愛いらしく_fat arrow_(なぜなら->
は細く =>
は太い)、または_lambda関数_(他の言語でそう名付けられているため)とも呼ばれます。一般的に利用される機能のひとつは、このアロー関数()=> something
です。これを使う理由は次の通りです:
function
を何度もタイプしなくて済むthis
の参照をレキシカルスコープで捕捉するarguments
の参照をレキシカルスコープで捕捉する
関数型言語と比べると、JavaScriptではfunction
を頻繁に打ち込まなければならない傾向があります。アロー関数を使うと、関数をシンプルに作成できます
this
はJavaScriptにおいて昔から頭痛の種でした。 ある賢い人は「this
の意味をすぐに忘れるJavaScriptが嫌いだ」と言いました。アロー関数は、それを囲んだコンテキストからthis
を捕捉します。純粋なJavaScriptだけで書かれたクラスを使って考えてみましょう:
このコードをブラウザで実行すると、関数内のthis
はwindow
を参照します。なぜなら、window
がgrowOld
関数を実行しているからです。修正方法は、アロー関数を使うことです:
これがうまくいく理由は、アロー関数が、関数本体の外側のthis
を捕捉するからです。次のJavaScriptコードは同等の動きをします(TypeScriptを使用しない場合の書き方です)。
TypeScriptを使っているので、はるかに快適な構文で書けます。アロー関数とクラスは、組み合わせて利用できます:
Tip:アロー関数の必要性
簡潔な構文が得られることに加えて、関数を他の何かに呼び出してもらいたい場合も、アロー関数を使うだけで良いのです。本質的には以下の通りです:
自分で呼び出す場合は以下のようになります:
どちらでも、this
は正しいコンテキストになります(この例ではperson
)。
Tip:アロー関数の危険性
実は、this
を_呼び出しコンテキストにしたい_場合は_アロー関数を使うべきではありません_。jquery、underscore、mochaのようなライブラリで使用するコールバックのケースです。ドキュメントがthis
の機能について言及している場合は、おそらくアロー関数の代わりにfunction
を使うべきでしょう。同様に、あなたがarguments
を使うことを予定している場合は、アロー関数を使用しないでください。
Tip:this
を使用するライブラリのアロー関数
this
を使用するライブラリのアロー関数thisを使う多くのライブラリ、例えばjQuery
の反復(例: https://api.jquery.com/jquery.each/)はthis
を使って現在反復中のオブジェクトを渡します。このようなケースにおいて、ライブラリが渡したthis
だけでなく周囲のコンテキストにもアクセスしたい場合は、アロー関数が無いときに行うように_self
のような一時変数を使用してください。
Tip:アロー関数と継承
クラスのプロパティとしてのアロー関数は、継承において正常に動作します:
しかし、子クラスで関数をオーバーライドした場合、super
キーワードは動作しません。プロパティはthis
に行きます。this
は1つしかないので、このような関数は、親クラスの同じ関数を呼び出すことはできません(super
はprototypeのメンバだけで動作します)。メソッドを子にオーバーライドする前に、メソッドのコピーを作成することで回避できます。
Tip:Quick Object Return
時には単純なオブジェクトリテラルを返す関数が必要な場合もあります。しかし、下記のような場合:
JavaScriptランタイム(JavaScriptの仕様に原因がある)によって_JavaScript Label_を含む_ブロック_として解釈されます。
この意味がわからなくても心配しないでください。いずれにしろ、"unused label"(未使用のラベル)というTypeScriptのナイスなコンパイラエラーが発生します。Labelは古い(そしてほとんどは使用されていない)JavaScript機能で、現代のGOTO(経験豊富な開発者は悪いものとみなす🌹)として無視して構いません。
()
でオブジェクトのリテラルを囲むことで修正できます:
最終更新