JavaScriptの高次関数
2725 ワード
高次関数は英語でHigher-order functionと言います.高次関数は何ですか?数学とコンピュータ科学では、高次関数は少なくとも次の条件を満たす関数である.は、入力 として1つ以上の関数を受け取る.は、関数 を出力します.
高次関数の関数はパラメータとして関数を使用します.
JavaScriptの関数は実はすべてある変数を指しています.変数が関数を指すことができるので、関数のパラメータが変数を受け取ることができます.この関数は高次関数と呼ばれます.
一番簡単な高次関数:
高次関数の戻り値出力
JavaScriptでは、関数は最初のクラスのオブジェクトであり、パラメータとして伝達されてもよく、他の関数の戻り値として出力されてもよい.
高次関数はまた、いくつかの並べ替えアルゴリズム(高速列、泡、ヒルなど)があるようなモードのコンストラクタとしても使用でき、並べ替え器を生成することができる.
ajaxパッケージの列を挙げて、簡単なajaxサーバーのデータを要求する機能を書きました.二つのパラメータmethodとcalbackを受け取ります.要求の種類とコールバック.毎回入ってくる要求タイプが面倒くさいです.じゃ、新しい関数を二つ生成します.ajaxGet一つはajaxPostです.
偏関数とは、偏関数のことです.パラメータや変数が予め設定されている関数Aがあると仮定して、Aを呼び出して新しい関数Bを生成します.次の例を見てもいいです.判定タイプのデモ
高次関数の関数はパラメータとして関数を使用します.
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なども同様の原理です.