大家好,欢迎来到IT知识分享网。
简介:
柯里化(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;
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127939.html