カレーの起源と数学者のハスケル・カレーの名前(プログラミング言語Haskellも彼にちなんで名付けられています)。
カレーは通常、部分評価とも呼ばれます。その意味は、パラメーターを段階的に関数に渡すことです。各パラメーターが渡されたら、部分的にパラメーターを適用し、より具体的な関数を返して、残りのパラメーターを受け入れます。このような部分パラメーター関数の複数の層は、最終結果が返されるまで中央にネストできます。
したがって、カレーのプロセスは、パラメーターを徐々に通過させ、徐々に機能の適用範囲を狭め、徐々に解決するプロセスです。
合計関数のカレー
ステップバイステップの評価に続いて、簡単な例を見てみましょう
var concat3words = function(a、b、c){return a+b+c; }; var concat3wordscurrying = function(a){return function(b){return function(c){return a+b+c; }; }; }; console.log(concat3words( "foo"、 "bar"、 "baza")); // foo bar baza console.log(concat3wordscurrying( "foo")); // [function] console.log(concat3wordscurrying( "foo")( "bar")( "baza")); // foo bar bazaご覧のとおり、concat3wordscurrying( "foo")は関数であり、各コールは新しい関数を返し、別の呼び出しを受け入れ、結果が最終的に返され、分布が解決され、レイヤーごとに進行するまで新しい関数を返します。 (PS:閉鎖の特性はここで利用されます)
だから今、私たちはさらに進みます。 3つ以上のパラメーターを渡す必要がある場合、できるだけ多くのパラメーターを渡して、パラメーターが渡されないときに結果を出力できますか?
まず、通常の実装をしましょう。
var add = function(items){return items.reduce(function(a、b){return a+b}); }; console.log(add([1,2,3,4]));ただし、各番号に10を掛けてから追加するように依頼した場合は、次のとおりです。
var add = function(items、multi){return items.map(function(item){return item*multi;})。 }; console.log(add([1、2、3、4]、10));幸いなことに、マップと削減機能があります。このパターンに従う場合は、各アイテムに1を追加して要約する必要があります。マップ内の関数を置き換える必要があります。
カレー化の実装を見てみましょう。
var adder = function(){var _args = []; return function(){if(arguments.length === 0){return _args.reduce(function(a、b){return a + b;}); } [] .push.apply(_args、[] .slice.call(arguments)); return arguments.callee; }}; var sum = adder(); console.log(sum); //関数合計(100,200)(300); //コール形式は柔軟性があり、1つ以上のパラメーターを一度に入力でき、Chain Call to Sum(400)をサポートします。 console.log(sum()); // 1000(合計計算)上記の加算器はカレー型の関数であり、新しい関数を返し、新しい関数はバッチ内の新しいパラメーターを受け入れ、最後の計算まで遅延します。
一般的なカレー機能
より典型的なカレーは、最後の計算を関数にカプセル化し、この関数をパラメーターとしてカレー関数に渡します。これは明確で柔軟です。
たとえば、各用語に10を掛けて、処理機能をパラメーターとして渡すことができます。
var currying = function(fn){var _args = []; return function(){if(arguments.length === 0){return fn.apply(this、_args); } array.prototype.push.apply(_args、[] .slice.call(arguments)); return arguments.callee; }}; var multi = function(){var total = 0; for(var i = 0、c; c = arguments [i ++];){total+= c; }合計を返します。 }; var sum = currying(multi); sum(100,200)(300); sum(400); console.log(sum()); // 1000(空白の呼び出しの場合にのみ計算されます)このようにして、sum = currying(multi)、通話は非常に明確であり、使用効果も素晴らしいです。たとえば、複数の値を蓄積するには、複数の値をパラメーター合計(1,2,3)として使用するか、チェーンコールをサポート(1)(2)(3)をサポートできます。
カレーの基礎
上記のコードは実際には高次関数です。高次関数は、関数を動作させる関数を指します。パラメーターとして1つ以上の関数を受信し、新しい関数を返します。さらに、中間プロセスに入力されたパラメーターを保存するために、閉鎖の特性も依存しています。今すぐ:
関数はパラメーターとして渡すことができます
関数は、関数の戻り値として使用できます
閉鎖
カリの役割
遅延計算。上記の例は比較的低いです。
パラメーター多重化。同じ関数が複数回呼び出され、渡されたパラメーターがほとんど同じである場合、関数はカレーの良い候補である可能性があります。
動的に関数を作成します。これは、部分的な計算結果の後に動的に生成できます。これに基づいて、新しい関数が動的に生成され、後続のビジネスを処理するため、繰り返し計算が省略されます。または、パラメーターのサブセットの一部を呼び出し関数に渡すことにより、新しい関数を動的に作成することができます。これにより、繰り返し渡されたパラメーターを保存します(必ずしも将来は必ずしもそうではありません)。たとえば、イベントブラウザを追加するための補助方法:
var addevent = function(el、type、fn、capture){if(window.addeventlistener){el.addeventlistener(type、function(e){fn.call(el、e);}、capture); } else if(window.attachevent){el.attachevent( "on" + type、function(e){fn.call(el、e);}); }};イベントを追加するたびに、... else ....実際には、ブラウザでは、1回だけ決定をする必要がある場合に実行する必要があります。判断後の結果に基づいて新しい関数を動的に生成することができ、将来それを再計算する必要はありません。
var addevent =(function(){if(window.addeventlistener){return function(el、stype、fn、capture){el.addeventlistener(el.addeventlistener(e){fn.call(el、e);}、(caption));};} el.Attachevent( "on" + stype(e){fn.call(e);}}});この例は、if ... else ...の最初の判断の後、計算の一部が完了し、後で渡されたパラメーターを処理するために新しい関数が動的に作成されます。これは典型的なカリル化です。
function.prototype.bindメソッドもカレーアプリケーションです
直接実行するコール/適用メソッドとは異なり、BINDメソッドは最初のパラメーターを関数実行のコンテキストに設定し、他のパラメーターはターンの呼び出しメソッドに渡されます(機能の本体は実行されず、遅延実行と見なされます)。
var foo = {x:888}; var bar = function(){console.log(this.x); } .bind(foo); // bind bar(); // 888以下は、バインド関数のシミュレーションです。 TestBindは、新しい関数を作成して返します。新しい関数では、実際にビジネスを実行したい関数は、実際のパラメーターで渡されたコンテキストにバインドされ、実行が遅れます。
function.prototype.testbind = function(scope){var fn = this; ////これは、testbindメソッドを呼び出す関数を指します。 }}; var testbindbar = bar.testbind(foo); // console.log(testbindbar)の実行を遅らせるためにfooをバインドします。 //関数(バインド後、実行後、実行を遅らせる新しい関数を返します)testbindbar(); // 888ここでは、プロトタイプでのこの理解に注意を払う必要があります。
上記の記事JavaScriptのカリーでカレーする関数の詳細な分析は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。