我正在尝试通过编写回调来使 "merge function" 工作。

I'm trying to make the "merge function" work by writing a Callback.

我认为我对回调的理解还很幼稚。但这是到目前为止的情况,我的功能只是将每个数组中的第一个索引加在一起。

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

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

您的 return 语句是您的函数 return 仅对每个数组的第一个索引求和的原因。它终止函数调用并且永远不会到达您的回调调用。这应该可以帮助您使其正常工作。注意:有上千种方法可以实现您在此处尝试做的事情。

var merge = function(array1, array2, callback){ 
  var sum=0; 
  for (var i = 0; i < array1.length; i++) { 
    sum = sum + callback(array1[i],array2[i]); 
  } 
  return sum;
}; 
var x = merge([1, 2, 3, 4], [5, 6, 7, 8], 
           function(a, b){ return a + b; }); 
console.log(x);

当您使用回调时,您的代码流现在是通过回调而不是 return 和变量赋值。我在您的代码中看到混合用法,我不清楚您的代码试图做什么。 for循环中的return会在调用回调之前终止合并函数。

我可能会调整你的代码:

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

这会将此结果记录到控制台:

[6, 8, 10, 12]

为了更进一步,我还会在 for 循环中使用 Math.max(array1.length, array2.length) 来确保结果数组与最长的输入数组一样长。那里有点复杂,但我想指出一个潜在的问题。

您返回得太早了,循环的第一次迭代将结束函数调用。

看起来您想使用回调来完成合并工作,就像您使用 Array 的 .filter, .sort 一样。如果是这种情况,您要么在合并函数中完成工作,要么在回调中完成工作,但不能同时进行。

意思是您要么在合并函数中 array1[i]+array2[i] 将每个参数添加到一个新数组,要么将参数传递给回调并将回调的每个结果放入新数组。

var merge = function(array1, array2, callback){  
  //test to make sure arrays are same length
  if(array1.length != array2.length){
     throw new Error('Arrays are of different lengths'); 
  }
  var out = [];
  for (var i = 0; i < array1.length; i++) {
    if(callback){
      out.push( callback(array1[i],array2[i]) );
    } else {
      out.push( array1[i] + array2[i] );
    }
  }
  return out;
};

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

document.body.innerHTML = x.toString();
document.body.innerHTML += '<br>'+x2.toString();

//will cause the error to be thrown
var x2 = merge([1, 2, 3, 4], [6, 7, 8]);