简介:
柯里化(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(()=>{})); // trueconsole.log(isFunction({})); // false
根据箭头函数特性精简:
const typeOfTest = type => thing => typeof thing === type;