百度百科: 柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
示例函数
// 判断传入的内容和类型是否一直
const checkType = function (type, content) {
return Object.prototype.toString.call(content) === `[object ${type}]`
}
console.log('原始版-类型是否正确 :>> ', checkType('Number', 10));
简易版: 针对指定函数柯里化
// 1. 传入类型
const simpleCurrying = function (type) {
// 2. 传入内容
return function (content) {
// 3. 执行函数checkType
return checkType(type, content);
};
};
const isNumberSimple = simpleCurrying('Number')
console.log('简易版-类型是否正确 :>> ', isNumberSimple(10));
通用的柯里化函数
/**
* 函数=>柯里化
* @param {*} func 待柯里化的函数
* @param {*} args 保存参数列表
* @returns
*/
function createCurry(func, args = []) {
// 获取func的参数个数
const funcSize = func.length
// 依次拆分func为更明确的函数
return function () {
// 获取当前传入的参数列表
const params = Array.prototype.slice.call(arguments)
// 依次缓存参数列表直到满足执行func为止
const _args_ = args.concat(params)
if (_args_.length < funcSize) {
// 递归创建执行下一步的函数
return createCurry(func, _args_)
}
// 参数列表一致后执行func函数
return func(..._args_)
}
}
const curryingType = createCurry(checkType)
const isNumber = curryingType('Number')
console.log('通用版-类型是否正确 :>> ', isNumber(10));