2016-06-22 83 views
0

嗨,這裏是一些使用數組減少方法關閉w3學校的代碼。我正在嘗試學習如何使用這個,但是爲什麼這段代碼甚至可以工作,我有點困惑。爲什麼numbers.reduce(getSum) doesent參數在getSum函數中。我們的代碼如何甚至知道數組內部有多少事物,以及如果我們甚至不給getSum函數提供參數如何總結它們。在w3schools上,它說array.reduce(function(total,currentValue,currentIndex,arr),initialValue),並且還說需要total和currentValue。但我們在這裏甚至沒有他們嗎?我們只是有我們的功能!請幫助。數組減少方法

<!DOCTYPE html> 
<html> 
<body> 

<p>Click the button to get the sum of the numbers in the array.</p> 
<button onclick="myFunction()">Try it</button> 

<p>Sum of numbers in array: <span id="demo"></span></p> 

<script> 
var numbers = [65, 44, 12, 4]; 

function getSum(total, num) { 
    return total + num; 
} 
function myFunction(item) { 
    document.getElementById("demo").innerHTML = numbers.reduce(getSum); 
} 
</script> 

</body> 
</html> 

繼承人另一個例子..不知道有什麼區別

var numbers = [15.5, 2.3, 1.1, 4.7]; 

function getSum(total, num) { 
    return total + Math.round(num); 
} 
function myFunction(item) { 
    document.getElementById("demo").innerHTML = numbers.reduce(getSum,0); 
} 
+0

不同的是在初始值: 「未定義」與「0」。首次使用'undefined'第一個數組元素。另外,第二個將所有數字舍入爲整數。 –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce可能會更好一些,但基本上它可以寫成'numbers.reduce(function(total, num){return total + num;});'如果getSum被替換爲匿名函數。其餘的可以通過鏈接更好地解釋。 –

回答

1

減少函數的語法是arr.reduce(callback[, initialValue])

這意味着getSum被稱爲回調

什麼是回調?簡單來說,它是對第二時刻將要調用的函數的引用。

一個簡單的例子(但網絡是充滿回調指南):

function print(value) { 
    console.log(value) 
} 

function callCallback(callback) { 
    callback('Hello world!'); 
} 

callCallback(print); 

正如你可以看到打印是一個函數,並把它的引用作爲參數傳遞給callCallback()傳遞。該函數然後在callCallback()內部調用。

讓我們回到你的問題:

reduce()需要一個函數作爲第一個參數的參考。

reduce是一個函數,它內部會做一些事情(看一個可能的實現,read here)。

某處reduce()將回調您作爲參數傳遞的函數,傳遞右參數。

我們必須減少是這樣的:

reduce(callback) { 
    callback(previousValue, currentValue); 
} 

所以對於陣列中的每個值,你作爲參數傳遞的函數將被調用,它的參數將與previousValuecurrentValue

填充

當然,reduce()肯定比較長,但最後它會從數組中取出一些東西,做一些魔術,然後傳遞給你作爲回調參數傳遞的函數。

+0

我有點困惑。我們的程序如何知道如何獲得數組的第一,第二和第三個值? getsum函數可以添加它們,但我們如何獲取它們? –

+0

@cresjoy我更新了回覆。 – rpadovani

+0

那麼基本上reduce()有一個經過數組的每個元素的內置方式? –

1

在功能getSum,你有兩個參數,totalnum這些分別相當於totalcurrentValue,在W3學校的例子。在JavaScript中,您的函數不必在函數中具有相同的變量名稱。您傳遞給reduce的函數需要兩個參數,第一個參數將用作「運行總數」,第二個參數用作「當前值」。

至於這個問題,它是如何知道陣列內有多少個值的,請看看MDN提供的polyfill。它提供了一些有關如何爲數組實現reduce函數以及知道數組多長時間的信息。

+0

「兩個參數是必需的功能你通過減少「,這是我真正需要的,現在我只需要了解它是如何知道數組中的值。 –

+0

@cresjoy好吧,它是作爲Array原型中的函數實現的。基本思想是該函數將爲數組中的_every_值調用回調函數。實質上,它確實是'var value; for {var i = 0;我 pantalohnes

+0

。所以內置的減少本身? –

1

array.reduce(callback [,initialValue])。

回調=對數組的每個值執行的函數,有4個參數。

1)previousValue =在上一個回調中返回的值或者用reduce給出的初始值。

2)currentValue =數組中當前元素的值。

3)currentIndex =數組中當前元素的索引。

4)陣列=陣列,它被稱爲上

初值是可選的,並給出了我們以前的值在所述第一回調起始值。

所以你實際上有這個論點。初始值(前一個回調的結果),實際數字,數字索引和數組數組。

編輯:如果你不給一個初始值,你以前的值將是數組的第一個元素,你的當前值是第二個。

編輯2:你的第一次運行的前一個值是65,你的當前值是44.他們加起來,給出一個結果109,並將其作爲結果值。函數被調用直到你完成你的數組。這意味着您第一次回調(109)的返回值將是您第二次回調的前一個值。同樣,它會將前一個(109)和當前數據相加,即數組中的下一個(第三個)元素。他們將它們加起來(109 + 12)並返回下一個回調的值,等等。直到你完成整個數組。最後它只是返回你的總數。

+0

由於我們可以有4個參數,並且(getsum)提供了2個,如果我們這樣做(getsum,0)就是當前索引? IE什麼是做差異(gettum)vs(getsum,0) –

+0

@cresjoy否,通過做(getsum,0),你給予reduce函數它是第二個參數,它是初始值。記住,函數就像這個array.reduce(callback,initValue)。 init值是optional.callback是你的實際getsum函數,在那個函數中你必須有一個當前值。 – TanguyB

+0

@cresjoy我編輯了我的答案,看看編輯2,你應該知道這個函數是如何工作的。 – TanguyB

0

您必須區分函數調用和函數定義。

函數定義

function test() {} 

功能調用

test(); 

傳遞函數需要一個函數定義不調用,所以可以傳遞基準(可變定義函數)或函數定義本身。

numbers.reduce(functionVariableReference); // pass function definition 
numbers.reduce(function() {}) //anonymous function definition 

的Array.reduce需要一個回調到每個元件上執行,這個回調被傳遞調用以下參數,total,currentValue,currentIndex,arr

又如:

function test(nOne, nTwo) {console.log(nOne + nTwo);} 
function passTwoAndThree(callback) {callback(2,3)}; 
passTwoAndThree(test) // will log 5;