クローズドとコリ化

2819 ワード

クローズドとコリゼーションはJavaScriptでよく使われていて、しかも比較的高級な技術です.すべての関数式プログラミング言語はこの二つの概念を支持しています.ですから、JavaScriptの関数式プログラミングの特徴を十分に発揮したいです.この二つの概念を深く理解する必要があります.
一、コリ化の概念      コンピュータ科学では、コリック化は、複数のパラメータを受け取る関数を単一のパラメータ(最初の関数の最初のパラメータ)を受け入れる関数に変換し、残りのパラメータを受け入れて結果を返す新しい関数の技術です.この技術はChristpher Stracheyによって論理学者Haskell Curryによって命名されました.それはMoses SchenfinkelとGottlob Fregeによって発明されました.直感的に、コリック化は「一定のパラメータを固定すれば、残りのパラメータを受け入れる関数が得られる」と主張しています.したがって、2つの変数がある関数yxに対して、y=2が固定されると、変数がある関数2 xが得られます.
      カリー化とは、関数のいくつかのパラメータを事前に導入し、簡単な関数を得ることです.しかし、先に入ってきたパラメータはクローズドに保存されていますので、いくつかの特異な特性があります.たとえば:
var adder = function(num){
                return function(y){
                     return num + y;
                }
             }
 var inc = adder(1);
 var dec = adder(-1);
 ここのinc/decの2つの変数は、実際には2つの新しい関数であり、括弧で呼び出すことができます.
//inc, dec         ,          (+/-)1
print(inc(99));//100
print(dec(101));//100
print(adder(100)(2));//102
print(adder(2)(100));//102
二、コリ化の応用      柯里化の特性によって、私達はもっと面白いコードを書くことができます.例えば、先端開発でよくこのような状況が発生します.ローカルリフレッシュを使うのは簡単ですが、コードは書きやすいです.カリー化を使うと、私たちのコードをかなり美化して、維持しやすくなります.例を見てみます.
//update       ,        id   item web     
function update(item) {
    return function(text) {
        $("div#" + item).html(text);
    }
}

//Ajax  ,        callback
function refresh(url, callback) {
    var params = {
        type: "echo",
        data: ""
    };
    $.ajax({
        type: "post",
        http: //www.html5china.com/js/jsadv/url,
        cache: false,
        async: true,
        dataType: "json",
        data: params,
        //          
        success: function(data, status) {
            callback(data);
        },
        //          
        error: function(err) {
            alert("error : " + err);
        }
    });
}
refresh("action.do?target=news", update("newsPanel"));
refresh("action.do?target=articles", update("articlePanel"));
refresh("action.do?target=pictures", update("picturePanel"));
では、udate関数は、カリー化の一例であり、関数を返します.
update("newsPanel") = function(text){
       $("div#newsPanel").html(text);
}
は、udate(「newsPanel」)の戻り値が関数であり、必要なパラメータが文字列であるため、refshのAjax呼び出しでは、successがサーバ端に入ってきて戻ってくるデータ情報をcalbackに入力し、newsPanelパネルの更新を実現し、他の文章パネルarticarticlePanel、写真パネルのpicture Panelというように更新して、このように更新します.コードの可読性は、メンテナンス性が向上しました.
参考:https://github.com/shichuan/javascript-patterns/blob/master/function-patterns/currying.html
        中の二つのダイナミックなカリー化の関数は勉強の価値があります.