JavaScript での関数のカリー化
容器を用意し、水を加え、コード行を追加し、カレーの葉とマサラ (好みに応じて) を追加し、弱火で 25 分間調理します。 . ボーイとゴルの冗談です。
こんにちは、JS 開発者の皆さん。話題の「関数カリー化」で帰ってきました
このストーリーは次の内容をカバーしています。
- カリー化とは何か、どのように機能するのか、なぜ使用されるのか。
物語はここから始まる
関数カリー化とは?
カリー化とは、複数の引数を取る関数 [例: functionName(a, b,c)] を、シーケンス内の単一の引数を取る複数の関数に変換することです。
わかりました わかりました..、それが混乱しているように聞こえることは知っていますが、これを初めて読んだときの反応も同じでした。
分かりやすいように、すべての引数を 1 回で取得する関数 (doSum)、つまり doSum(a, b, c) [以下の例: 通常の加算関数。
シーケンス内で一度に 1 つの引数を取るいくつかの関数 (addNumbers(a)、(b)、(c)) に変換されます。
注: 両方の関数の機能 (目的) は同じですが、わかりやすいように名前を変更しただけです。
オタクのためのオタクによるカリー化の機能は次のとおりです。
これは、関数型プログラミングの手法であり、複数の引数の関数を単一の引数の複数の関数に順番に変換します。
簡単に言えば、関数はすべての引数を一度に受け取るのではなく、最初の引数を取り、もう一方の引数を取る関数を返し、次に 3 番目の引数を取る別の関数を返すというように、すべての引数が取得されるまで続きます。撮影された (関数カリー化という名前の画像の例)。
カレーはどのように機能しますか?
JavaScript でのカリングは、JavaScript であるため、理解するのが少し難しいかもしれません
しかし、それを乗り越えようとしましょう。以下は単純な関数の例です
ここで、関数「doSum」は、指定された引数を追加し、渡されたすべての引数の合計を返します。
以下は、同じ関数のカリー化されたバージョンです (理解を深めるために名前を変更しただけです)
上の関数と下の関数の出力は同じになります。18
addNumbers は上記の関数 doSum のカリー化されたバージョンです。addNumber 親関数は引数 (この場合は 5) を取り、別の引数 (この場合は 6) を取る別の無名関数を返し、プロセスはすべてのパラメーターが渡されるまで続きます。最後の無名関数は、すべての入力を処理した後に値を返します。
上記の例ではネストされた関数を実装したため、各関数は 1 つの引数を取り、すべての引数が完了するまで別の関数を返します。
bind 関数を使用する方法とクロージャーを使用する方法の 2 つの方法で関数をカリー化できます。どのように見えるか見てみましょう。
bind 関数を使用した関数カリー化
バインド機能がわからない場合は、この私の話を確認してください。
上記の例では、javascript の bind 関数を使用しており、bind 関数を使用して「onBoardUser」関数をカリー化しています。
basicCompanyDetails はオンボーディングされたすべてのユーザーに似ているため、オンボーディングされたすべてのユーザーがデフォルトで詳細を利用できるようにしたいと考えています。ここでは、バインド関数に引数「basicCompanyDetails」を渡し、「onBoardUser」のインスタンスを作成しています。 bind 関数は、メモリ内のどこかに保存して後で実行できる関数を返します。ここでは、関数を addUser に保存し、すべてのユーザーに対して呼び出しています。
これは、JavaScript で bind 関数を使用して関数をカレー化する方法です。下の画像のその他の例。
addUserToSales メソッドを呼び出すときに両方のパラメーターを渡すこともでき、同じ結果が出力されます。
クロージャを使用した関数カリー化。
クロージャーは、JavaScript では非常に一般的ですがトリッキーな概念ですが、あまり議論されていません。ここでクロージャーとは何かを読むことができます。
クロージャーを使用して関数カリー化を実装してみましょう。
上記の例では、1 つの引数を取り、別の引数を取り、詳細を合計して返す別の無名関数を返す関数「onBoardUser」を作成しました。
accountDepartmentDetailsという 1 つの引数を指定して関数「onBoardUser」を呼び出し、それを変数に格納します (onBoardUser は関数を返すことに注意してください)。そのため、関数を変数addUsertoAccountsに格納すると、変数にはいつでも呼び出すことができる関数が含まれます。要求している引数なので、 addUsertoAccountsに格納されている匿名関数 (onBoardUser によって返される)を引数 (ユーザーの詳細、つまり detailsOfJohn) で呼び出しました。
関数が呼び出されると、関数内にあるステートメントの実行が完了し、出力が出力されます。
関数が約 10k 行のコードの後で呼び出された場合、クロージャーであるため同じ出力が出力され、そのレキシカル スコープが記憶されます。
ES6 でのカリング:
これは、JS でクロージャーを使用して関数カリー化を使用する方法です。
それでも、頭の中に 1 つの疑問があるかもしれません。関数に複数の引数を渡すことができるなら、なぜカリー化が必要なのですか?
これはおそらくそれらの疑問に答えます。
なぜ使われるのか
どうして?どうして?どうして?
- カリー化は、関数をより小さな関数に分割する手法であり、個々の関数には独自の機能があり、関数を純粋にし、エラーや副作用が発生しにくいものにします。
- 例: 最初の関数はユーザーの詳細を検証し、2 番目の関数は会社の詳細を検証します。
- 関数型プログラミングで高階関数を使用するために使用されます
- コードをクリーンで整理しておくのに役立ちます。
- また、続行する前にすべてが揃っていることを確認するのに役立つメカニズムとしてカリー化を使用できます
- 例: 必要な引数を取得しない場合、ネストされた各関数は実行されません。

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































