2016-07-09 90 views
0

我正在學習JS,並試圖理解回調。我碰到一個鏈接來了:How to explain callbacks in plain english? How are they different from calling one function from another function? 在接受的答案使用回調的解決辦法如下:回調不同於從另一個函數調用(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); 

然而,當我試圖做同樣的事情,而無需使用回調如下,我得到了相同的答案以上。

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

在你的第二個例子中,negate沒有定義。那是遺漏嗎? – wafflecat

+0

順便說一句,回調只是正常的,匿名函數。他們沒有什麼特別的。 – 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,最好將其作爲varconstconst adder = ...)傳遞給reduce

This post可能會讓您更好地理解函數如何成爲JS中的「頭等公民」,以及如何在您的問題之外的其他環境中使用回調函數。