JS详解-函数柯里化

本文介绍了柯里化的概念,展示了如何将函数转换为接受单个参数并返回新函数的形式,以及如何通过数组管理参数并实现动态参数个数限制。同时讨论了柯里化在实际应用中的泛型思想和箭头函数优化。
摘要由CSDN通过智能技术生成

简介:

柯里化(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;

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值