背景:面试题
给定一个函数
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)
柯里化是函数式编程的一种概念,是将函数当做参数来传递和返回的,且没有副作用,因为它是只会返回新值,不会改变系统变量的编程方式。
柯里化函数学习
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.