function each(collection, callback) {
if (Array.isArray(collection)) {
for (var i = 0; i < collection.length; i++) {
callback(collection[i]);
}
}
else {
for (var prop in collection) {
callback(collection[prop], prop, collection);
}
}
}
var array = [1, 2, 3, 4, 5];
function reduce(collection, callback, initial) {
var current = initial;
each(collection, function(current, e) {
current = callback(current, e);
})
return current;
}
console.log(reduce(array, function(a, b) { return a + b }, 0)); -->>> 0
我试图重写下划线each / reduce函数,并使用reduce中的每个函数。我知道我在那里有一个错误 - (当前不应该在每个回调函数中)它应该只是
each(collection, function(e) {
current = callback(current, e);
})
并按原样返回15
,但为什么当您在其中添加0
作为参数时,它会返回current
?它不应该只返回NaN
吗?由于循环的最后一部分将尝试添加5
和未定义的NaN
。
答案 0 :(得分:3)
问题在于,只要将current
添加到回调函数的参数列表中,就会有两个变量 - 具有相同的名称,但位于不同的范围内。回调中的一个阴影 reduce
函数中的那个。
因此,使用callback
传递给回调和each
的元素调用undefined
减速器,但将结果(NaN
)分配给{{1}时它只会分配给current
回调的本地变量。
外部each
变量将完全不受影响,当从current
返回时,它仍保留reduce
值,并使用 - initial
进行初始化。