柯里化函数学习

背景:面试题

给定一个函数

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)

柯里化是函数式编程的一种概念,是将函数当做参数来传递和返回的,且没有副作用,因为它是只会返回新值,不会改变系统变量的编程方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章