函数柯里化
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