Contents

函数柯里化

Contents

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”

函数柯里化可以让我们在不同的环境使用相同的调用方法

参数的复用

函数柯里化最简单的应用就是参数的复用,可以简化后续调用

function uri(protocol, hostname, pathname) {
  return function (hostname, pathname) {
    return `${hostname}${pathname}`;
  };
}
let uri_https = uri("https://");
let uri2 = uri_https("plumliil.eu.org", "/tags");
let uri3 = uri_https("plumliil.eu.org", "/about");

console.log(uri2, uri3);

在上方代码中第一次使用 uri 函数来获得了一个新的函数 uri_https,此时通过闭包可以将 protocol 保存下来供后续函数使用,在接下来的代码中通过调用新函数uri_https来获得最终的返回结果,此过程实现了https://参数的复用

兼容性的检测

通过函数柯里化可以检查代码是否在ie浏览器或者主流浏览器中运行如 // 立即执行函数,只需触发一次if判断

const watchEvent = (function () {
  if (window.addEventListener) {
    return function (element, type, listener, useCapture) {
      element.addEventListener(type, function (e) {
        listener.call(element, e)
      }, useCapture)
    }
  } else if (window.attachEvent) {
    return function (element, type, handler) {
      element.attachEvent('on' + type, function (e) {
        handler.call(element, e)
      })
    }
  }
})();

延迟执行

function add() {
  let args = [...arguments];
  let inner = function () {
    args.push(...arguments)
    return inner
  }
  inner.toString = function () {
    return args.reduce((pre, cur, index) => {
      return pre + cur
    }, 0)
  }
  return inner;
}

let res = add(1)(2)(3)(4);
console.log(res); // 
console.log(typeof res); // function