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

trying to understand how the syntax works in the call back functions

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

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

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);

在第二个中,您正在记录函数的 returned 值。

在第一个中,您记录每次合并发生时的值,但不查看 returned 值。如果您记录了 return 值,您会看到它是未定义的,并且在合并函数完成执行后没有实际更改任何值。

回调函数不必 return 值。但请注意,您的第一个版本没有 returning 任何东西。你的第二个版本是 returning 一个值。如果您只查看 returned 值,那么它会告诉您差异。第一个版本是 undefined,第二个版本是 [6,8,10,12]。差异是 return 的结果。由于回调函数中的 console.log,第一个看起来只是 returning 一个值。

简化这两段代码会有所帮助。让我们考虑 "making" 和使用字符串 "hello".

的两种不同的(非常人为的)方式

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

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 函数只知道如何找到正确的对并将它们传递到您的回调中。

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

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

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]);

对于第一个示例,不需要 return,因为 merge 函数会将其提供给 callback 而不是return正在处理它。所以 var x = 部分没有用,调用后 x 将是未定义的。

您的第二个示例如下所示:

 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);

对于这种情况,merge 函数实际上 returns 值但使用 回调(这不是真的你所谓的回调,它只是一个函数)来自定义它合并数组中的值的操作。