JS详解-函数柯里化

JS详解-函数柯里化本文介绍了柯里化的概念 展示了如何将函数转换为接受单个参数并返回新函数的形式 以及如何通过数组管理参数并实现动态参数个数限制

大家好,欢迎来到IT知识分享网。

简介:

柯里化(Currying)是一种关于函数的高阶技术。柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)形式。柯里化不会调用函数。它只是对函数进行转换。

JS详解-函数柯里化

举个例子:

已最简单的两项相加可得

<script> // 定义接收一个参数的函数 function sum(a){ // 内部返回一个接收剩余参数的新函数,返回累加结果 return function(b){ return a + b; } } </script>

JS详解-函数柯里化

那如果是三项相加的currying呢?“嵌套!”

 // 定义接收一个参数的函数 function sum(a){ // 内部返回一个接收剩余参数的新函数,返回累加结果 return function(b){ // 试着在接收一个参数并返回 return function(c){ return a + b + c; } } }

JS详解-函数柯里化

变式-达到一定目标参数个数就累加:

JS详解-函数柯里化
解决代码:

 // 保存不定长参数 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; } }

可我们发现如此实现的柯里化函数只能使用一次JS详解-函数柯里化

这是为什么呢?通过检查数组JS详解-函数柯里化

是清空数组功能未实现!

nums = []

JS详解-函数柯里化

代码调优-参数自定义:

 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; }

JS详解-函数柯里化

实际运用:

作者拙见有点像泛型

 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;

JS详解-函数柯里化

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

(0)
上一篇 2025-09-04 12:45
下一篇 2025-09-04 13:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信