我认为我对回调的理解是相当绿色的。但到目前为止,我的功能只是将每个数组中的第一个索引添加到一起。
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);
答案 0 :(得分:2)
当您使用回调时,代码流现在通过回调而不返回和变量赋值。我在您的代码中看到了各种用法,我不清楚您的代码正在尝试做什么。 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]
为了更进一步,我还将使用Math.max(array1.length, array2.length)
循环中的for
来确保结果数组与最长的输入数组一样长。那里有一点复杂,但我想指出一个潜在的问题。
答案 1 :(得分:1)
你的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);
答案 2 :(得分:1)
你回来太早,循环的第一次迭代将结束函数调用。
看起来您希望使用回调来执行合并工作,就像使用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]);