柯里化:一个函数原本有多个参数,只传入一个参数,生成一个新函数,由新函数接收剩下的参数;
偏函数:一个函数原本有多个函数,只传入一部分参数,生成一个新函数,由新函数接收剩下的参数
高阶函数: 一个函数A,参数是一个函数B,该函数A对这个参数B进行加工,得到一个函数,这个加工用的函数A就是高阶函数
为什么要柯里化?
提升性能:可以缓存一部分能力
将以下函数柯里化
function add(a, b, c) { return a + b + c; }
实现
function curryFunc(func, args) { var funcLen = func.length; var args = args || []; return function() { var _args = [].slice.call(arguments); [].push.apply(_args, args); // 如果参数个数小于最初的func.length,则递归调用,继续收集参数 if (_args.length < funcLen) { return curryFunc.call(this, func, _args); } return func.apply(this, _args); } }
应用
function add(a, b, c, d) { return a + b + c + d; } var curryAdd = curryFunc(add); let a = curryAdd(7, 1, 1); let b = curryAdd(7)(1)(1); console.log(a, b); //9, 9
参数个数应与func保持一致
function add(a, b, c, d) { return a + b + c + d; } var curryAdd = curryFunc(add); let a = curryAdd(7, 1, 1, 1); let b = curryAdd(7)(1)(1)(1); console.log(a, b);
再应用
function check(targetString, reg) { return reg.test(targetString); } var _check = curryFunc(check); var checkPhone = _check(/^1[34578]d{9}$/); var isphone = checkPhone('183888888'); //false