目的
- 理解函数柯里化
- 利用柯里化简化类型判断代码
先实现一个通用的类型检测方法
function isType(typeing, val) {
return Object.prototype.toString.call(val) === `[object ${typeing}]`;
}
再看一下柯里化函数的使用方式
假如我们有个求和函数,
function add(a,b,c,d,e){
return a+b+c+d+e
}
并且可以用下面的方式调用
Currying(add)(1)(2,3)(4,5)
从上面的调用方式可以看到
– Currying 函数返回的是函数,直到调用最后一次返回结果
– 参数被缓存起来了,可以在下一个函数调用时使用
最重要的如何实现currying函数
最重要的如何实现currying函数
const currying = (fn, ...args) => {
let length = fn.length;
return (...userArgs) => {
args = args.concat(userArgs);
return args.length >= length ? fn(...args) : currying(fn, ...args);
};
};
- 上面args放在currying函数参数里利用闭包缓存起来
- length变量保存最后要执行的函数的需要的参数个数
- 在每次调用后保存到目前为止传入的参数,在传入的参数个数大于等于需要的参数个数时执行fn,就是我们最终完成需求的函数
- 参数个数没有达到要求时,仍然返回一个函数用于之后接着调用
最后
const types = ["String", "Number", "Boolean", "Array"];
let utils = {};
types.forEach((type) => {
utils[`is${type}`] = Currying(isType)(type);
});
console.log(utils.isString("11"));
console.log(utils.isNumber(11));