JavaScriptの高次関数

2725 ワード

高次関数は英語でHigher-order functionと言います.高次関数は何ですか?数学とコンピュータ科学では、高次関数は少なくとも次の条件を満たす関数である.
  • は、入力
  • として1つ以上の関数を受け取る.
  • は、関数
  • を出力します.
    高次関数の関数はパラメータとして関数を使用します.
    JavaScriptの関数は実はすべてある変数を指しています.変数が関数を指すことができるので、関数のパラメータが変数を受け取ることができます.この関数は高次関数と呼ばれます.
    一番簡単な高次関数:
    function  sum (x, y, f){
       return f(x) + f(y)
    }
    
    sum(-2,6,Math.abs)を呼び出すと、パラメータx,yとfはそれぞれ-2,6と関数Math.absを受信し、関数の定義に従って、計算過程を導き出すことができます.
    x = -2;y =6;f = Math.abs;f(x) + f(y) ==> Math.abs(-2) + Math.abs(6) ==>2+6 ;return 8
    
    コードで検証してみます.
    sum(-2,6,Math.abs);//8
    
    もう一つはみんながよく知っている例を挙げて、Aray.prototype.sort方法は一つの関数をパラメータとして受け入れます.
    var arr = [1, 3, 5, 7, 2, 4, 6]; 
    arr.sort(function(a, b) { 
         return a - b; //      ,        ,  return b - a;
     });
    
    高次関数を作成すると、関数のパラメータが他の関数を受信することができます.一般的なイベントバインディング・コールバック関数,ajaxコールバック関数なども高次関数に属している.
    高次関数の戻り値出力
    JavaScriptでは、関数は最初のクラスのオブジェクトであり、パラメータとして伝達されてもよく、他の関数の戻り値として出力されてもよい.
    高次関数はまた、いくつかの並べ替えアルゴリズム(高速列、泡、ヒルなど)があるようなモードのコンストラクタとしても使用でき、並べ替え器を生成することができる.
    //   
    var sortGenerator = function(sortFunc){
    return function(args){       
     var arguments = [].slice.call(args);
         return sortFunc(arguments);    
    }};
    
    //        
    var quickSort = require('quickSort.js');
    var quickSorter = sortingGenerator(quickSort);
    //    
    quickSorter (4, 22, 44, 66, 77);
    
    おそらくあなたは疑問があるかもしれません.私が直接にrequireを使って入ってきたquickSortはだめです.なぜ余計なことをするのですか?もう一つ包装すればもっと多くのことができます.例えば、各並べ替えアルゴリズムの時間消費をテストします.
    ajaxパッケージの列を挙げて、簡単なajaxサーバーのデータを要求する機能を書きました.二つのパラメータmethodとcalbackを受け取ります.要求の種類とコールバック.毎回入ってくる要求タイプが面倒くさいです.じゃ、新しい関数を二つ生成します.ajaxGet一つはajaxPostです.
    var ajaxGenerator=function(method){
              return function( callback ){
                  ajax( method, '/url',  callback  )
             }
    }
    var ajaxGet=ajaxGenerator('get')
        ajaxGet(mycallback )
    
    var ajaxPost=ajaxGenerator('post')
        ajaxPost(mycallback  )
    
    上の像は関数のカリー化とは違って,高次関数の降順に属する.
    偏関数とは、偏関数のことです.パラメータや変数が予め設定されている関数Aがあると仮定して、Aを呼び出して新しい関数Bを生成します.次の例を見てもいいです.判定タイプのデモ
    var isType = function(type){
    return function(obj){
    return toString.call(obj)=='[object '+type+']';
    }
    };
    
    //カスタマイズした新しい関数
    var isString = isType('String');
    var isArray = isType('Array');
    var isFunction = isType('Function');
    
    //偏関数の試験
    console.log(isString('abc')); // true
    console.log(isArray([1, 2])); // true
    console.log(isFunction('abc')); // false
    
    isType関数には判定タイプの方法が予め用意されていますが、部分パラメータのみを指定して発生する新しいカスタマイズ関数isString、isAray、isFunctionは偏り関数です.実はjqueryのajax、$getと$postなども同様の原理です.