函数柯里化学习笔记

1、什么是函数柯里化

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

2、怎么实现简单的函数柯里化

// 实现一个简单的加法
function add(a,b){return a+b}
add(1,2);


// 用柯里化实现
const currying = (x) => {
     return (y) => {return x+y}
}
console.log(currying(1)(2)) // 3

简单可以理解为调用函数,传如一个参数,返回一个函数,完成函数的定制化。

2、实现经典的无限调用的函数柯里化

// 我们可以这样理解调用add(1)时返回一个函数fn,然后执行fn(2)依次被调用,当执行到最后一次返回结果
function add(num){
    var sum=num;
    var fn=function(v){
        sum+=v;
        return fn
    }; 
    fn.toString=function(){
        return sum
    };
    return fn
}
console.log(add(1)(2)(3)(4)) // 10
// 执行add(1)时返回了fn函数给2,3,4执行,同时定义了fn的toString方法,
// 每个对象的toString和valueOf方法都可以被改写,每个对象执行完毕,如果被用以操作JavaScript解析器就会自动调用对象的toString或者valueOf方法
// 利用toString隐式调用的特性,当最后执行时隐式调用,并计算最终的值返回

这里是用到了一些闭包、递归相关的概念和思想,第一次调用函数之后传入参数,在主函数作用域声明变量去保存所有的参数,之后的所有调用都是在调用函数内部的函数,实现主函数内部变量的改变、保存。
最后调用的时候虽然还是返回的一个函数,但是因为重写了fn 的 toString 方法,所以当读取这个函数的值时,会返回已经保存的变量的值,也就是说返回的即是一个函数,也可以说返回的函数已经保存了一个值回来。

3、进阶版可以传多个参数的的函数柯里化

function add(){
    var args = [...arguments];
    var fn=function(){
        args.push(...arguments);
        return fn
    }; 
    fn.toString=function(){
        return _args.reduce(function (a, b) {
            return a + b;
        });
    };
    return fn
}
consolo.log(add(1)(1,2,3)(2)) // 9

利用arguments 或者 rest (…) 获取所有参数之后保存起来,最后函数 toString 方法调用的时候去求出结果。

3、函数柯里化的好处和坏处

// 实现一个判断数据类型的方法
const checktype = function(type, content) {
    return Object.prototype.toString.call(content) === `[object ${type}]`;
}
checktype('Number',2); // true
// 这种方法总是要把type参数传过去,如果写错了就会影响到正确的结果了,可以考虑下如何做到把“Number“做到复用

const curry = function(type){
    return function(content){
        return Object.prototype.toString.call(content) === `[object ${type}]`;
    }
}
const isNumber =  curry('Number');
isNumber(3) // true 
// 这里就实现参数的复用了,这样的实现给之后的调用带来了很大的便利

函数柯里化是可以给我们带来一下便捷,但是也是会有缺点的,在性能上也会受到影响,比如add函数里面需要创建数组去存放每次调用的时候的参数,创建闭包函数这些都会对内存跟速度上会带来花销,存取arguments对象通常要比存取命名参数要慢一点。
总结就是会让我们的一些业务场景函数写法更加简介。
但同时消耗更多性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值