2016-07-09 52 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中的“头等公民”,以及如何在您的问题之外的其他环境中使用回调函数。