javascriptのコールバック関数

3558 ワード

関数が他のデータのように個々の変数に値を付けられ、定義、削除、コピーができるなら、なぜ他の関数にパラメータとして伝達されないですか?
以下の例では、2つの関数をパラメータとする関数を定義します.この関数は、それぞれ2つのパラメータ関数を実行し、それらの戻り値の合計を返します. 
function invoke_and_add(a,b){

    return a() + b();            

}
この2つの加算に参加する関数を簡単に定義します.硬符号化値を単純に返します.
function one(){

    return 1;

}

function two(){

    return 2;    

}
次に、この二つの関数をターゲット関数invoke(u)に渡すだけです.and_add()で、実行結果が得られます.
invoke_and_add(one,two)
3
実際には、one()とtwo()の代わりに匿名関数を直接使用してもよく、例えば、ターゲット関数のパラメータとして、
invoke_and_add(function){return 1;},function(){return 2;}
関数Aを関数Bに渡してBでAを実行すると、Aはコールバック関数になります.この時Aがまだ無名の関数であるならば、匿名のコールバック関数と呼びます.
じゃ、コールバック関数はいつ使うべきですか?いくつかの応用例を通して、コールバック関数の利点を示します.
*名前なしで関数を伝えることができます.
*関数の呼び出し操作を他の関数に委託することができます.コードの作成作業を節約できるという意味です.
*性能向上にも貢献します.
 
コールバックの例:
プログラミング中には、関数の戻り値を他の関数に渡す必要があります.次の例では、第一のmultiplayByTwoを定義し、この関数は、1つのループを通して、受け入れられた3つのパラメータをそれぞれ2倍にして、行列の形で結果を返します.二つ目の関数addOne()は一つの値だけを受け入れて、1を加えて返します. 
function multiplyByTwo(a,b,c){

    var i,ar =[];

    for (i=0;i<3;i++){

    ar[i] = arguments[i]*2;

}

    return ar;        

}



function addOne(a){

    return a+1;

}
この二つの関数をテストします.
multiplyByTwo(1,2,3);
[2,4,6]
addOne(100)
101
次に、これら3つの要素の2つの関数間の伝達を実現するには、要素を格納するための配列を定義する必要がある.まずmultipllyByTwoの呼び出しから始めます.
var marr=[];
myarr=multiplyByTwo(10,20,30)
[20,40,60]
その後、各要素を巡回して、それぞれaddOne()に渡す.
for(var i=0;i<3;i+){myarr[i]=addOne(myarr[i];
マイヤー
[21,41,61]
ご覧のように、このコードは作業できますが、ある程度の改善スペースがあります.特にここでは二つのサイクルが使われています.データ量が大きいか、循環操作が複雑であれば、費用は相当かかります.したがって、私たちはそれらを一つにまとめる必要があります.これはmultiplyByTwo関数に対していくつかの変更を行う必要があります.これによって、一つのコールバック関数を受諾し、反復操作のたびに呼び出します.具体的には以下の通りです
function multiplyByTwo(a,b,c,callback)

{

    var i,ar=[];

    for(i=0;i<3;i++){

        ar[i]=callback(arguments[i]*2);

    }

    return ar;

}
関数の変更が完了したら、前の仕事は一回の関数で十分です.私たちは次のように初期値とコールバック関数を伝達すればいいです.
myarr=multiplyByTwo(1,2,3,addOne);
[3,5,7]
addOne()の代わりに匿名関数を用いることもでき、これにより追加的なグローバル変数を節約することができる.
myarr=multiplyByTwo(1,2,3,function(a){return a+1}
[3,5,7]
また、匿名関数を使用すると、いつでも必要に応じてコードが調整されやすくなります.たとえば:
myarr=multiplyByTwo(1,2,3,function(a){return a+2}
[4,6,8]