柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。javascript
例如這樣:html
//柯里化前 function add(a, b) { return a + b; } add(10, 2) // 12 //柯里化後 var add = function(a) { return function(b) { return a + b; }; }; var addTen = add(10); addTen(2); // 12
function fn(){ var numList = [].slice.call(arguments); var _fn = function(){ var innerArguments = [].slice.call(arguments); numList = numList.concat(innerArguments); return _fn; } _fn.valueOf = function(){ return numList.reduce(function(num1, num2){ return num1 + num2; }); } return _fn; } console.log(fn(1)(2)(3));
這段代碼初看可能不太好理解,這裏咱們將它拆分一下:java
戳MDN,介紹的特別詳細。segmentfault
每個js函數內部都有arguments,它表明傳入的參數數組。arguments 是一個類數組對象。能夠用下面的語句將arguments轉化成數組對象:數組
var numList = [].slice.call(arguments); //將arguments轉化成數組對象
還有經常使用的:[].slice.call(arguments, 1)
返回的是arguments數組從1號位開始的片斷。用來獲取arguments
裏除了第一項之外的其餘全部選項。app
返回 Boolean 對象的原始值:函數
<script type="text/javascript">
var boo = new Boolean(false); document.write(boo.valueOf()); //false </script>
這裏也可使用添加 toString()
的方式實現這一功能,與 valueOf()
作法一致。學習
接收一個函數做爲累加器。語法:spa
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
使用範例:code
var numbers = [65, 44, 12, 4]; function getSum(total, num) { return total + num; } function myFunction(item) { document.getElementById("demo").innerHTML = numbers.reduce(getSum); }
能夠看個人另外一篇博客:遞歸
首先如果想要實現 fn()()
這種調用方式的函數,則在 fn
函數體內必定也會返回一個函數。如果想要實現 fn()()()...
不定次數的調用,則意味着每一層的返回值均爲一個函數,這就須要使用相似遞歸的方式去實現。在函數調用的最後一層,這個返回值應該是一個值而非函數,這裏則須要使用 valueOf
這一方法。使用內置對象 arguments
對函數中所傳入的參數獲取,arguments
不是數組,而是對象,將其轉換爲數組。使用數組的reduce
方法實現求和。
學習並感謝:
二、柯里化實現累加器
三、柯里化與箭頭函數