2016-08-11 117 views
0

我正在嘗試使用更高階的函數,試圖成爲更好的JavaScript開發人員。Javascript Reduce Function not working

我從下面的代碼中得到的錯誤是TypeError: myArray.reduce is not a function我發誓我遵循正確的設計模式。

function myFunction(myArray) { 
    return myArray.reduce((prev, curr) => prev * curr); 
} 
var myArray = [3, 2, 3] 
var myObject = myFunction.apply(myObject, myArray); // Will each element in array be multiplied? 
+2

爲什麼不簡單'var myObject = myFunction(myArray);'? – Arnauld

+0

你使用什麼瀏覽器/版本?我知道我們看到鉻44不支持=>但是47或48。 – klog

+0

@Arnauld我正在嘗試使用apply,arrow函數和減少模式。 –

回答

4

你想用.call,而不是.apply

.call將傳遞每個對象,並將它們直接傳遞給該函數,而.apply將採用一組參數並將它們作爲每個單獨的變量傳遞。

你可以看到下面的效果,用這種簡單的腳本:

function myFunction() { 
 
    console.log(arguments); 
 
} 
 
var myArray = [3, 2, 3]; 
 

 
myFunction.call(null, myArray); 
 
/* 
 
Will echo out { 
 
    "0": [ 
 
    3, 
 
    2, 
 
    3 
 
]} 
 
    
 
The first variable will contain the entire array 
 
*/ 
 

 
myFunction.apply(null, myArray); 
 
/* 
 
Will echo out { 
 
    "0": 3, 
 
    "1": 2, 
 
    "2": 3 
 
} 
 
    
 
The first variable will be 3, the second 2, and the third 3 
 
*/

+2

或者,'myFunction.apply(myObject,[myArray])'。 – melpomene

+0

看起來我需要做更多的閱讀! –

+0

@ChrisClark更多閱讀 - > http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply – aw04

1

而不是使用

var myObject = myFunction.apply(myObject, myArray); 

使用

var myObject = myFunction.call(myObject, myArray); 

由於function.prototype.apply方法將每個數組項作爲參數。 myArray參數變成3,2,3這樣它的行爲就像你的函數帶了3個參數一樣。