函数科里化


函数科里化

定义

函数柯里化又叫部分求值,维基百科中对柯里化 (Currying) 的定义为

柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

实现

function currying(fn) {
  return function (...args) {
    return args.length >= fn.length // 新函数接收的参数长度是否大于等于 fn 剩余参数需要接收的长度
      ? fn.apply(this, args) // 满足要求,执行 fn 函数,传入新函数的参数
      : currying(fn.bind(this, ...args)); // 不满足要求,递归 currying 函数,新的 fn 为 bind 返回的新函数(bind 绑定了 ...args 参数,未执行),新的 length 为 fn 剩余参数的长度
  };
}

// 极简版currying实现
// const currying = (fn) =>
//   (judge = (...args) =>
//     args.length >= fn.length
//       ? fn(...args)
//       : (...arg) => judge(...args, ...arg));

const add = currying((a, b, c) => a + b + c);
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));

实际应用 - 延迟计算

function currying1(fn) {
  return function (...args) {
    return args.length === 0 // 函数执行时机,直到最后一次不传参调用时执行
      ? fn.apply(this, args)
      : currying1(fn.bind(this, ...args));
  };
}

const add1 = currying1((...args) => args.reduce((a, b) => a + b));
console.log(add1(1)(2)(3)());
console.log(add1(1, 2)(3)(4)());
console.log(add1(1, 2)(3)(4, 5)(6)());

 上一篇
JavaScript 中的继承 JavaScript 中的继承
JavaScript 中的继承1. 原型链继承原型链的问题: 原型中包含的引用值会在所有实例间共享 子类型在实例化时不能给父类构造函数传参 function SuperType() { this.property = true;
下一篇 
节流和防抖 节流和防抖
节流和防抖防抖防抖的原理就是:你尽管触发事件,但是我一定在事件触发 n 秒后才执行,如果你在一个事件触发的 n 秒内又触发了这个事件,那我就以新的事件的时间为准,n 秒后才执行,总之,就是要等你触发完事件 n 秒内不再触发事件,我才执行。
  目录