试图了解语法在回调函数中的工作原理

时间:2015-09-30 20:24:51

标签: javascript callback

我正在学习回调函数,但我对以下两个函数的语法感到困惑。它们都给出了相同的结果,但是用不同的语法编写,然而,为什么第一个不需要"返回结果"但第二个呢?是因为"回调(结果)"已经返回功能,没有必要返回?但对于第二个合并函数,由于回调打开" array1 [i],array2 [i]",结果需要返回?

如果我的理解不正确,请纠正我。感谢。

var merge = function(array1, array2, callback){  
  var result = [];
  for (var i = 0; i < array1.length; i++) {
   result[i] = array1[i] + array2[i];
  };
callback(result) 
};

var x=merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) {console.log(merged)});
 var merge = function(array1, array2, callback) {
  var result = [];

  for (i=0; i < array1.length; i++) {
    result[i] = callback(array1[i], array2[i]);   
  }
  return result;
};

var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){  
  return a + b;
});
console.log(x);

3 个答案:

答案 0 :(得分:3)

如果简化两段代码,将会有所帮助。让我们考虑两种不同的(非常人为的)方式&#34;制作&#34;和消费字符串&#34;你好&#34;。

您的第一个例子(或多或少)等同于以下内容:

function makeHello(callback) {
  callback("hello");
}

makeHello(function (str) {
 alert(str) // callback consumes the value produced by the function
});

我们有一个产生值的函数,并通过将其传递给回调函数使该值可用。这主要用于以异步方式生成值且无法从函数返回的情况。

您的第一个示例,merge函数包含用于连接两个数组(在本例中为+运算符)的逻辑,并生成完全合并的结果本身。然后它通过回调函数使您可以使用该值。

你的第二个例子使用回调来达到完全不同的目的;它的回调涉及帮助产生最终价值:

function makeHello(callback) {
  return callback() // callback produces the value we need to return
}

alert(makeHello(function () {
  // callback isn't *consuming* the result, its helping to *produce* the result
  return "hello"
}));

一旦生成,该函数只需返回它即可传达该值。同样,这是唯一可能的,因为该值是以同步方式生成的。

在第二个示例中,merge函数实际上并不知道如何合并两个数组。你的回调负责这样做; merge函数只知道如何找到正确的对并将它们传递给你的回调。

答案 1 :(得分:1)

在第二个中,您将记录函数的返回值。

在第一个中,您将记录每个合并的值,但不会查看返回的值。如果您已记录返回值,您将看到它未定义,并且在合并函数执行完毕后没有实际更改任何值。

回调函数不必返回值。但请注意,您的第一个版本没有返回任何内容。而你的第二个版本正在返回一个值。如果您只查看返回的值,那么它会显示差异。第一个版本为undefined,第二个版本为[6,8,10,12]。差异是回归的结果。由于回调函数中的console.log,它看起来只是第一个返回值。

答案 2 :(得分:1)

回调只是一个传递给另一个函数的函数,因此它可以使用它将值返回给您(第一个示例)或者能够自定义该接收函数的某些部分(第二个示例) )。

如果您不使用回调,您的代码将如下所示:

&#13;
&#13;
var merge = function(array1, array2, callback) {
  var result = [];
  for (var i = 0; i < array1.length; i++) {
    result[i] = array1[i] + array2[i];
  };
  console.log(result); // this is your callback code
};

merge([1, 2, 3, 4], [5, 6, 7, 8]);
&#13;
&#13;
&#13;

对于第一个示例,不需要返回,因为合并功能会将其提供给回调而不是返回它。所以var x = part是无用的,调用后x将是未定义的。

你的第二个例子看起来像这样:

&#13;
&#13;
 var merge = function(array1, array2, callback) {
   var result = [];

   for (i = 0; i < array1.length; i++) {
     result[i] = a + b; // your callback code gets executed here
   }
   return result;
 };

 var x = merge([1, 2, 3, 4], [5, 6, 7, 8]);
 console.log(x);
&#13;
&#13;
&#13;

对于这种情况,合并功能实际上会返回值,但使用回调(这实际上并不是您所谓的回调,它&& #39; s只是一个函数)来自定义它合并数组中值的动作。