简介:
柯里化(Currying)是一种关于函数的高阶技术。柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c)
转换为可调用的 f(a)(b)(c)
。柯里化不会调用函数。它只是对函数进行转换。
举个例子:
已最简单的两项相加可得
<script>
// 定义接收一个参数的函数
function sum(a){
// 内部返回一个接收剩余参数的新函数,返回累加结果
return function(b){
return a + b;
}
}
</script>
那如果是三项相加的currying呢?“嵌套!”
// 定义接收一个参数的函数
function sum(a){
// 内部返回一个接收剩余参数的新函数,返回累加结果
return function(b){
// 试着在接收一个参数并返回
return function(c){
return a + b + c;
}
}
}
变式-达到一定目标参数个数就累加:
解决代码:
// 保存不定长参数
let nums = [];
function sum(...args) {
// 往数组中插入不定长参数
nums.push(...args)
// 判断参数的个数
if(nums.length >= 5) {
// 长度大于等于5时,返回累加结果
// 注意:就算大于五个参数,也只会返回前五个参数的累加结果
// 这里使用了reduce方法,对数组中的每个元素进行累加
// slice方法用于截取数组中的前五个元素
const res = nums.slice(0, 5).reduce((prev, next) => prev + next, 0);
return res;
} else {
// 2.2 长度没到5 返回函数接收剩余参数
return sum;
}
}
可我们发现如此实现的柯里化函数只能使用一次
这是为什么呢?通过检查数组
是清空数组功能未实现!
nums = []
代码调优-参数自定义:
function sumMaker(length){
// 保存不定长参数
let nums = [];
function sum(...args) {
// 往数组中插入不定长参数
nums.push(...args)
// 判断参数的个数
if(nums.length >= 5) {
// 长度大于等于5时,返回累加结果
// 注意:就算大于五个参数,也只会返回前五个参数的累加结果
// 这里使用了reduce方法,对数组中的每个元素进行累加
// slice方法用于截取数组中的前五个元素
const res = nums.slice(0, 5).reduce((prev, next) => prev + next, 0);
// 清空数组
nums = [];
return res;
} else {
// 2.2 长度没到5 返回函数接收剩余参数
return sum;
}
}
return sum;
}
实际运用:
作者拙见有点像泛型
const typeOfTest = function(type) {
function isUndefined(thing){
return typeof thing === type;
}
return isUndefined;
}
// 测试代码
const isFunction = typeOfTest('function');
console.log(isFunction(()=>{})); // true
console.log(isFunction({})); // false
根据箭头函数特性精简:
const typeOfTest = type => thing => typeof thing === type;