柯里化一般也稱部分求值,其含義是給函數分步傳遞參數,每次傳遞參數後部分應用參數,並返回一個更具體的函數接受剩下的參數,這中間可嵌套多層這樣的接受部分參數函數,直至返回最後結果。
所以柯里化的過程是逐步傳參,逐步縮小函數的適用範圍,逐步求解的過程。
我的理解爲在函數傳執行時函數並不計算結果,而是返回一個新的函數,這個新的函數已經內置了以前的參數,在須要計算結果時再返回結果。閉包
通用的柯里化函數app
var curry = function (fn) { //利用閉包來保存參數 var _args = []; return function () { //若是參數爲0返回計算結果 if (arguments.length === 0) { return fn.apply(this, _args); } //不然將參數添加到_args中並返回當前函數 [].push.apply(_args, arguments); return arguments.callee; } };
柯里化一個求和函數函數
var add = curry(function () { return [].reduce.call(arguments, function (a, b) { return a + b; }) }); add(2, 4); add(4); add(2, 3, 45); //此時函數並未執行加法運算,只是保存了添加的參數 add(); //這裏執行了加法運算,返回計算結果60