柯里化定义
柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数的新函数
fn(1)(2)(3)(4);fn(1, 2)(3)(4);fn(1, 2, 3)(4);fn(1, 2, 3, 4);
柯里化的思想就是把参数缓存起来,等到特定的时机来计算返回结果,比如实现一个 add
方法
add(1)(2)(3) = 6add(1, 2)(3) = 6add(1, 2, 3) = 6
function add(...args) { function _add(...args2) { return add.apply(null, [...args, ...args2]); } // 隐式转换,先调用valueOf再调用toString _add.valueOf = _add.toString = function () { return args.reduce((a, b) => a + b); }; return _add;}console.log(add(1)(2)(3)); // 6console.log(add(1, 2)(3)); // 6console.log(add(1, 2, 3)); // 6
柯里化应用
延迟执行
举个例子,绑定 dom 事件的时候,我们经常做了一个兼容的写法,例如
function addEvent(el, type, fn, isCapture = false) { if (window.addEventListener) { el.addEventListener(type, fn, isCapture); } else { el.attachEvent(`on${type}`, fn); }}
这样有一个缺点就是每次调用 addEvent 方法都需要判断再绑定,这时候可以利用柯里化来实现
const addEvent = (() => { if (window.addEventListener) { return (el, type, fn, isCapture = false) => { el.addEventListener(type, fn, isCapture); }; } else { return (el, type, fn) => { el.attachEvent(`on${type}`, fn); }; }})();
- 提前返回 – 使用函数立即调用进行了一次兼容判断(部分求值),返回兼容的事件绑定方法
- 延迟执行 – 返回新函数,在新函数调用兼容的事件方法。等待 addEvent 新函数调用,延迟执行