QiitaJavaScriptで関数型プログラミングの入門RevisionsPreviousNext「気をつけるべきは三点」をリンクに置換し、移動しやすいよう変更。コードのインライン表示記法を誤って利用している(と判断した)箇所を是正。シンタックスハイライトをJavaScriptの正しい記述に書き換え。JavaScript(関数型言語としてのJavascript)Javascriptでは関数型言語の一部の機能が備わっています。実践的なJavascriptの関数型について考えていきます。#関数型の特徴JSでの実装のみを知りたい場合は、-この項を飛ばして、`気をつけるべきは三点`へどうぞ。+この項を飛ばして、[気をつけるべきは三点](#1-3)へどうぞ。関数型言語では関数でプログラムを組みます。関数は参照透過性が保たれている(副作用がない)があります。-しかし、前者の`変数の再代入禁止`は縛りとして強すぎるので、+しかし、前者の「変数の再代入禁止」は縛りとして強すぎるので、JSでの実装においてはそこまで重視しません。再代入が少ない程、可読性はあがりやすいです。「引数が同じであれば何回その関数を実行しても結果が変わらない」ことをいいます。抑えるべきポイントは下記三点となります。入門として今回は扱いません。#すべての関数が値を返す関数がすべての値を返すようにします。Hello```これによりその返り値を利用し、さらに関数を組み立てていきます。参照渡しの引数の値を変更しない下記は関数は外側の変数を変更しないの例です。そもそも外側の変数は変更しないだけでなく、極力利用しないほうがいいです。8```次に参照渡しの引数の値を変更しないの例です。12]```Goodでは、新しく配列を作りそこに一つずつ二倍した値をいれていっています。Badでは二倍した要素を再び参照渡しで送られてきた配列にいれてしまっています。それでは外側の値に変更が生じてしまい、副作用ありの関数となってしまいます。本当は一つ目の「関数は外側の変数を変更しない」で集約されますね。#関数が値として扱える関数が値として扱えるので引数に関数を渡して処理を委譲、もしくは、関数を返り値として処理を委譲する事もできます。これらの関数を高階関数と言います。処理を委譲しています。次にクロージャによる返り値として関数を返す例です。Haru39```関数を返り値として処理を委譲しています。クロージャにより、カプセル化が実現できます。クロージャがわからない方はこちらの記事へどうぞ。](http://qiita.com/Haru39/items/4975031faf6f7baf077a)#まとめポイントは三点。非常に非効率的な実装となってしまいます。ループがfor文ではなく再帰を使用したりなど。for文をラップして使用する事は非常にメリットがあります。いった関数型を支援するライブラリとして、underscoreがあります。[JavaScriptで関数型プログラミングを強力に後押しするUnderscore.jsのおすすめメソッド12選(lodashもあるよ)](http://qiita.com/Haru39/items/7d4ead780710c627172e)さらにカリー化などを用いて、関数でプログラムを組んでいくこともある程度は可能です。カリー化はまた紹介します。