2016-07-09 5 views
0

私はJSを学んでおり、コールバックを理解しようとしていました。コールバックが別の関数(JS)からの呼び出しと異なりますか?

function processArray(arr, callback) { 
    var resultArr = new Array(); 
    for(var i = arr.length-1; i >= 0; i--) 
     resultArr[i] = callback(arr[i]); 
    return resultArr; 
} 

var arr = [1, 2, 3, 4]; 
var arrReturned = processArray(arr, function(arg) {return arg * -1;}); 
alert(arrReturned); 

を私は次のようにコールバックを使用せずに同じことをやってみましたしかし、私は上記と同じ答えを得た:次のようにコールバックを使用して解決策がある受け入れ答えでHow to explain callbacks in plain english? How are they different from calling one function from another function? :私はリンクに出くわしました。

function processArray2(arr) { 
    var resultArr = new Array(); 
    for(var i = arr.length-1; i >= 0; i--) 
     resultArr[i] = negate(arr[i]); 
    return resultArr; 
} 

function negate(n) { 
    return n*-1; 
} 
var arr = [1, 2, 3, 4]; 
var arrReturned2 = processArray2(arr); 
alert(arrReturned2); 

同じことをコールバックなしで行うことができる場合、なぜ上記の例でコールバックを使用する必要があるのでしょうか。私は間違いなく何かを欠いていることを知っている。しかし、私は何を理解するように見えることはできません。

+0

2番目の例では、否定は定義されていません。それは省略ですか? – wafflecat

+0

Btw、コールバックは単なる通常の匿名関数です。それらについて特別なことは何もありません。 – ftor

答えて

1

通常、コールバックを使用するには、厳密なの必要はありません。です。コールバックを使用するたびに、関数を直接呼び出すことができます。それは...関数が何であるかを正確に知っている限り、あなたのソースでそれを参照することができます!

あなたが習っているときにコールバックを避けることができれば、あなたのほうが簡単かもしれません。

しかし、これらはJSの不可欠な部分であり、高度化するにつれて必要になると言われています。 JS開発者は、ブラウザとのやりとりに多くを使用します。コールバックの必要性の主要な例はXHRオブジェクトです(あなたがそれらのことを聞いたことがないなら、心配しないでください、あなたのためにあなたの学習の早すぎるかもしれません)。

0

コールバックは、質問の文脈で、関数を変数として別の関数に入れる方法として使用できます。

var array = [1, 2, 3, 4, 5]; 
 
    
 
    var reduce = function (array, callback, start) { 
 
     array.forEach(function (value) { 
 
      start = callback(start, value); 
 
     }); 
 
     return start; 
 
    }; 
 
    
 
    function adder (prev, current) { 
 
     return prev + current; 
 
    } 
 
    
 
    var sum = reduce(array, adder, 0); 
 
    
 
    function multiplier (prev, current) { 
 
     return prev * current; 
 
    } 
 
    
 
    var product = reduce(array, multiplier, 1); 
 
    
 
    console.log(sum); // 15 
 
    console.log(product) // 120

reduce作成された、そしてそれは多くの機能を使用することができます。 (可読性は別として)一度だけadderを使用している場合は、それを引数としてreduceに入れることができます。あなたのアプリケーションで何度もadderを使用している場合はvarまたはconstconst adder = ...)としてreduceに転送する方が良いでしょう。

This postは、関数がJSの「ファーストクラスの市民」であることと、質問の外の他のコンテキストでコールバックがどのように使用されるかをよりよく理解できる場合があります。

関連する問題