Javascript中的reduce函数

Javascript中的reduce函数,javascript,functional-programming,abstraction,higher-order-functions,Javascript,Functional Programming,Abstraction,Higher Order Functions,我正在使用Marijn Haverbeke的《雄辩的Javascript》一书学习Javascript,但不理解以下示例: function reduce(combine, base, array) { forEach(array, function (element) { base = combine(base, element); }); return base; } function add(a, b) { return a + b; }

我正在使用Marijn Haverbeke的《雄辩的Javascript》一书学习Javascript,但不理解以下示例:

function reduce(combine, base, array) {
    forEach(array, function (element) {
        base = combine(base, element);
    });
    return base;
}

function add(a, b) {
    return a + b;
}

function sum(numbers) {
    return reduce(add, 0, numbers);
}
forEach函数是他在本书前面介绍的函数,如下所示:

function forEach(array, action) {
    for(var i = 0; i < array.length; i++)
        action(array[i]);
}

现在,回到reduce函数,我不明白的是,为什么在sum函数中,0被传递为reduce的基。这不是很奇怪吗?假设我尝试运行sum[1,2,3]。。。它在第一个循环中不是看起来像0=add0,1吗?我不明白。

加上之后,它只是把总数放在基数上。因此,它在每个循环中都会递增

基=组合基,元素

此语句首先计算combinebase、元素并将其分配给base。它不是比较0和add0,1。因此,对于下一次迭代,base将拥有所有先前值的总和

编辑

假设您调用reducecombine,0,[10,22,7,5]。循环将迭代为

Iteration           base          element
1                   0             10
计算完addbase元素后,base设置为10。所以对于下一次迭代,它的值是10

1                   10            22
计算完addbase元素后,base设置为32。所以对于下一次迭代,它的值是32

1                   32            7
计算完addbase元素后,base设置为39。所以对于下一次迭代,它的值是39

1                   39            5

计算完addbase元素后,base设置为44。因为没有更多的元素了,所以答案是44。

在添加之后,它只将总和放在基数上。因此,它在每个循环中都会递增

基=组合基,元素

此语句首先计算combinebase、元素并将其分配给base。它不是比较0和add0,1。因此,对于下一次迭代,base将拥有所有先前值的总和

编辑

假设您调用reducecombine,0,[10,22,7,5]。循环将迭代为

Iteration           base          element
1                   0             10
计算完addbase元素后,base设置为10。所以对于下一次迭代,它的值是10

1                   10            22
计算完addbase元素后,base设置为32。所以对于下一次迭代,它的值是32

1                   32            7
计算完addbase元素后,base设置为39。所以对于下一次迭代,它的值是39

1                   39            5

计算完addbase元素后,base设置为44。因为没有更多的元素了,所以答案是44。

base是包含所有元素之和的变量。它以0开头是正常的

它不是:0=add0,1


而是:base将包含base的上一个值之和,1

base是包含所有元素之和的变量。它以0开头是正常的

它不是:0=add0,1


而是:base将包含base和1之前的值之和。请记住,等号右侧的内容将首先计算。所以

base = combine(base, element)

正在获取combinebase、元素的结果,并将其分配给变量base,该变量现在将覆盖以前分配给的base。

请记住,首先计算等号右侧的内容。所以

base = combine(base, element)

获取combinebase元素的结果并将其分配给变量base,该变量现在覆盖了先前分配给base的内容。

不是0=add0,1,而是变量base被分配给了一个新值。这一点也不奇怪,因为你可以用JavaScript来实现。这不是Erlang之类的东西,不是0=add0,1,只是变量base被赋予了一个新的值。这一点也不奇怪,因为你可以用JavaScript来实现。这不是二郎什么的,我还是很困惑。。。调用函数add时,将值0指定给base。从现在开始,在函数内部调用时,是否应该用base替换0?base指向内存中的地址,对吗?JavaScript引擎如何知道何时应该使用存储在内存中的值以及何时应该直接指向它?换句话说,为什么第一个基址不被0替换?基址不是地址,它只是一个值。在第一次迭代中,它被0替换,但后来它被每个元素的值递增。为了详细解释,我编辑了我的答案。我仍然很困惑。。。调用函数add时,将值0指定给base。从现在开始,在函数内部调用时,是否应该用base替换0?base指向内存中的地址,对吗?JavaScript引擎如何知道何时应该使用存储在内存中的值以及何时应该直接指向它?换句话说,为什么第一个基址不被0替换?基址不是地址,它只是一个值。在第一次迭代中,它被0替换,但之后它会被每个元素的值递增,这些元素都是我为详细解释而编辑的答案。