在说明柯里化以前,首先须要理解高阶函数的定义javascript
高阶函数是指以函数做为参数的函数,伪代码能够理解为java
function higherOrderFunction(fn) { console.log(typeof fn) // "function" }
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数且返回结果的新函数的技术。数组
从定义中咱们能够对柯里化的步骤作一个简要的归纳:闭包
根据如上定义,能够用以下伪码表示柯里化的使用app
// 实现参数分步输入 function sum(a,b,c) { return [...args].reduce((pre,next) => (pre + next)); } // 存在一个函数currying const curriedSum = currying(sum); curriedSum(1)(2)(3); // 6; curriedSum(1, 2)(3); // 6; curriedSum(1, 2, 3); // 6;
// 用于函数抽象,高阶函数封装等 // 存在以下功能函数 function isPhone(number) { return /^1[34578]\d{9}$/.test(number); } function isMail(mail) { return /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/.test(mail); } /* 能够讲上面两个函数抽象为 regString.test(targetString); */ function check(reg, target) { return reg.test(target); } /* 可是每次使用时仍然须要输入正则做为参数,因而考虑利用柯里化的功能,将函数参数拆为两部分,正则 + 校验对象 假设存在一个柯里化函数currying(fn, reg) */ export const checkPhone = currying(check, /^1[34578]\d{9}$/); export const checkMail = currying(check, /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/); /* checkPhone和checkMail此时皆是只须要一个参数targetString的函数 使用时只需直接使用便可 */ checkPhone(13111111111); // true;
想要实现柯里化函数,须要掌握如下知识点函数
function currying(src) { // 记录源函数的形参长度 const length = src.length; // 参数列表 const argsPool = []; return function tmpFn (arg) { // 将参数推入参数池 argsPool.push(arg); // 长度判断 if (length > argsPool.length) { return tmpFn; } else { const res = src(...argsPool); argsPool = []; return res; } } } function sum(a, b, c, d, e, f) { return [...arguments].reduce((pre, next) => (pre + next)); } const _sum = currying(sum); _sum(1)(2)(3)(4)(5)(6); // 21
function currying(src, ...args) { // 记录源函数的形参长度 const length = src.length; // 参数列表 const argsPool = [...args]; return function tmpFn (...args) { // 将参数推入参数池 argsPool.push(...args); // 长度判断 if (length > argsPool.length) { return tmpFn; } else { const res = src(...argsPool); argsPool = []; return res; } } } function sum(a, b, c, d, e, f) { return [...arguments].reduce((pre, next) => (pre + next)); } const _sum = currying(sum); _sum(1)(2)(3)(4)(5)(6); // 21 _sum(1, 2, 3, 4)(5, 6); // 21
function currying(src, ...args) { // 参数列表 let argsPool = [...args]; return function tmpFn (...args) { if (args.length > 0) { argsPool.push(...args); return tmpFn; } else { const res = src(...argsPool); argsPool = []; return res; } } } function sum(...args) { return args.reduce((pre, next) => (pre + next)); } const _sum = currying(sum); _sum(1,2,3)(4,5)(); // 15 _sum(1,2)(); // 3