回调不同于从一个函数调用另一个函数 (JS)

Callback different from calling one function from another (JS)?

本文关键字:JS 函数调用 另一个 一个 函数 不同于 回调      更新时间:2023-09-26

我正在学习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);

当同样的事情可以在没有回调的情况下完成时,为什么我们需要在上面的例子中使用回调。我知道我肯定错过了什么。但我似乎不明白是什么。

通常,没有严格需要使用回调。每当使用回调时,都可以直接调用函数。那是。。。只要您确切地知道该函数是什么,您就可以在源代码中引用它!

如果你可以在学习时避免回调,那对你来说可能会更容易。

也就是说,它们是JS不可或缺的一部分,随着您越来越高级,它们将成为必要部分。JS开发人员经常使用它们与浏览器进行交互。需要回调的一个主要例子是 XHR 对象(如果您从未听说过它们,请不要担心,对于它们来说,现在学习它们可能还为时过早)。

在您的问题的上下文中,回调可以用作将一个函数作为变量放入另一个函数的方式。

  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

这篇文章可能会让你更好地理解函数在JS中是如何成为"一等公民"的,以及如何在你的问题之外的其他上下文中使用回调。