JS - 常见的函数设计

77 阅读1分钟

其实这些函数基本平常用不到,但是当你知道它时,可能某天就会给你启发,比如这个使用惰性函数的 commit

柯里化(Currying)

维基百科:

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

这里我们实现的是传递任意数量的参数,直到达到原函数的参数数量执行原函数:

function curry(fn: (...args: any[]) => void): any {
  const _curry = (...args: any[]) => {
    if (args.length === fn.length) {
      return fn(...args);
    } else {
      return (...addArgs: any[]) => _curry(...args, ...addArgs);
    }
  };

  return _curry;
}

const fn = curry(function (a, b, c) {
  return [a, b, c];
});

console.log(fn(1, 2, 3));
console.log(fn(1, 2)(3));
console.log(fn(1)(2, 3));
console.log(fn(1)(2)(3));

偏函数(Partial application)

维基百科:

In computer science, partial application (or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity.

简单来说就是固定函数的某些参数,然后产生只需要传递剩余参数的函数:

function partial(fn: (...args: any[]) => void, ...args: any[]): (...args: any[]) => void {
  return (...restArgs: any[]) => fn(...args, ...restArgs);
}

const fn = partial(function (a, b) {
  return [a, b];
}, 1);

console.log(fn(1));
console.log(fn(2));

惰性函数(Lazy Function)

惰性函数在第一次执行时被覆盖为合适的函数。最常见的是处理浏览器兼容:

function addEvent(el, type, fn) {
  if (window.addEventListener) {
    addEvent = function (el, type, fn) {
      el.addEventListener(type, fn, false);
    };
  } else if (window.attachEvent) {
    addEvent = function (el, type, fn) {
      el.attachEvent('on' + type, fn);
    };
  }
  addEvent(el, type, fn);
}

参考