背景:面試題
給定一個函數
const add = function (x, y, z) { return (x || 0) + (y || 0) + (z || 0); };
要求寫一個函數fn, 通過fn(add)(1)(2)(3)(4)...方式調用。
/** * 相加測試 * @returns {*} */ const add = function (x, y, z) { return (x || 0) + (y || 0) + (z || 0); }; /** * 相乘測試 * @constructor */ const Multiply = function (x, y, z) { return (x || 1) * (y || 1) * (z || 1); } /** * 柯里化函數 * @param add 必須是一個函數 * @returns {temp} */ const CurrieFn = function (add) { let sum; /** * 定義一個函數,拋出去供下次傳參調用 */ const temp = function (x) { sum = add(sum, x); return temp; }; /** * 重寫toString和valueOf方法 * 在參與計算、比較等涉及需要類型轉換的時候(打印也會) 會調用toString或valueOf函數 輸出結果 * @type {fn.valueOf} */ temp.toString = temp.valueOf = function(){return sum;}; return temp }; const addNum = CurrieFn(add)(1)(2)(3)(4); console.log(addNum) const MultiplyNum = CurrieFn(Multiply)(1)(2)(3)(4); console.log(MultiplyNum)
柯里化是函數式編程的一種概念,是將函數當做參數來傳遞和返回的,且沒有副作用,因爲它是隻會返回新值,不會改變系統變量的編程方式。
柯里化函數學習
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.