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先前被分配到)。