2

我使用Marijn Haverbeke的书能言善辩的JavaScript学习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作为传递basereduce。这不奇怪吗?假设我尝试运行sum([1,2,3]) ...在第一个循环中它看起来不像0 = add(0,1)吗?我不明白。

+1

它不是'0 = add(0,1)',它只是将变量(即'base')分配给一个新值。这并不奇怪,因为你可以在JavaScript中这样做。这不是Erlang或其他什么东西。 –

回答

2

添加后仅将其总和设置为base。所以它在每个循环中都会增加。

base = combine(base, element)

该声明首先计算combine(base, element)并将其分配给base。它没有比较0add(0, 1)。因此对于下一次迭代,base将具有所有先前值的总和。

EDITED

假设,你叫reduce(combine, 0, [10, 22, 7, 5])。循环将重复为

Iteration   base   element 
1     0    10 

计算add(base, element)base设置为10后所以对于下一次迭代,其值是10。

1     10   22 

计算add(base, element)base被设置为32之后。所以,下一次迭代,其值为32

1     32   7 

计算add(base, element),后210被设置为39。因此,对于下一次迭代,将其值39.

1     39   5 

计算add(base, element)后,base是由于没有剩下更多的元素设置为44,答案是44

+0

我还是很困惑......当调用函数'add'时,值'0'被分配给'base'。从这个角度来看,每当在函数内调用'base'时,不应该用'base'替代? 'base'指向内存中的地址,对吧? JavaScript引擎如何知道应该何时使用存储在内存中的值以及何时应该“指向”它?换句话说,为什么第一个'base'不能被'0'替代? – BeetleTheNeato

+1

_base_不是地址,它只是一个值。它在第一次迭代中被替换为'0',但随后它会被每个元素的值递增 编辑我的回答以获得详细解释。 – Shashwat

+0

非常感谢!我知道了! – BeetleTheNeato

1

base是将包含所有元素的总和的变量。这是正常的,它以0

这不是开始:0 =添加(0,1)

而是:基地将包含底座的前值和1

1

记住的总和,以及该首先评估等号右侧的内容。所以,

base = combine(base, element) 

正在采取的combine(base, element)结果,并将其分配给变量base(现在覆盖什么base先前被分配到)。