前端面试--js基础(实现函数柯里化)

函数柯里化是计算机科学的一个概念:指的是把接收多个参数的函数转化为接收单一参数的函数,返回一个函数去处理剩余的参数
例如
function sum(a,b,c){
return a+b+c;
}
var sum = a=>b=>c=>a+b+c;
ps:lodash中有curry这个柯里化函数
柯里化的作用:每次的传参在单一函数中进行处理,处理完后下一个函数使用处理后的结果和其他参数,符合单一职责原则(每个参数的处理放到一个函数中进行) SRP和逻辑复用

例如打印日志信息
var log1 = date => type => message => {
console.log([${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}][${type}]:[${message}]);
console.log(‘执行’);
}
// 定制化一个函数 防止多次传参
var newLog = log1(new Date());
newLog(‘DEBUG’)(“查询轮播图的bug”)
newLog(‘DEBUG’)(“新增添加用户的功能”)


// 实现一个自动柯里化的函数 实现原理就是用闭包把传参进行保存 当传参数量满足要求就执行函数
function curry(fn,args){
    // 获得函数需要的参数的长度 比如一个函数原来需要三个参数 柯里化后可以只传一个或两个
    let leng = fn.length;
    // 注意传空值的情况(args就是arguments的数组形式)
    args = args || [];
    return function(){
        // 先进行参数拼接
        let subArgs = args.slice(0);
        // 拼接现有的所有参数得到函数所需的所有参数
        for(let i=0;i<arguments.length;i++){
            subArgs.push(arguments[i]);
        }
        // 当已经传入的参数大于等于需要传入的参数,直接执行函数
        if(subArgs.length>=leng){
           return fn.apply(this,subArgs);
        }else{
            // 不满足就递归返回柯里化函数,注意参数拼接
            return curry.call(this,fn,subArgs)
        }
    }
}
// 也可以这么写
// function hyCurrying(fn){
//     return function curried(...args){
//         if(args.length>=fn.length){
//             return fn.apply(this,args)
//         }else{
//             function curried2(...args2){
//                 return curried.apply(this,args.concat(args2))
//             }
//             return curried2
//         }
//     }
// }
// function sum(a,b,c){
//     return a+b+c
// }
// console.log(curry(sum)(1)(2)(3))
// console.log(hyCurrying(sum)(1)(2)(3))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值