函数柯里化与反柯里化

本文探讨了柯里化技术如何优化函数调用,通过实例展示了如何避免重复执行,并介绍了反柯里化的概念,以及如何通过.call()方法实现函数的通用性。同时涵盖了JavaScript中Array.prototype.push的uncurrying应用。
摘要由CSDN通过智能技术生成

柯里化

比如想要个函数计算一个月一共花了多少钱: 

let sumMoney=0;
function cost(money){
    sumMoney+=money;
}
cost(100);
cost(50);
cost(200);
// 剩下的调用函数此处省略
console.log(sumMoney);

但实际上,我们并不希望这个cost函数执行31次,而是只在月底的时候执行1次。

改进:

(假设 参数为空就是到月底了)

let cost = (function () {
    let arg = [];
    return function () {
        if (arguments.length === 0) {
            let money = 0;
            for (let i = 0; i < arg.length; i++) {
                money += arg[i];
            }
            return money;
        } else {
            [].push.apply(arg, arguments);
        }
    }
})();
cost(100);
cost(50);
cost(200);
console.log(cost());

柯里化:

function cost() {
    let money = 0;
    for (let i = 0; i < arguments.length; i++) {
        money += arguments[i];
    }
    return money;
}
let currying = function (fn) {
    let arg = [];
    return function () {
        if (arguments.length === 0) {
            return fn.apply(this, arg);
        } else {
            [].push.apply(arg, arguments);
        }
    }
};
cost = currying(cost);
console.log(cost(100));
console.log(cost(50));
console.log(cost(200));
console.log(cost());

柯里化:

(不再依赖参数为空再累加)

function cost() {
    let money = 0;
    for (let i = 0; i < arguments.length; i++) {
        money += arguments[i];
    }
    return money;
}
let currying = function (fn) {
    let arg = [];
    return function () {
        [].push.apply(arg, arguments);
        return fn.apply(this, arg);

    }
};
cost = currying(cost);
console.log(cost(100));
console.log(cost(50));
console.log(cost(200));
console.log(cost());

反柯里化

比如Array.prototype.push()这个方法,但是它的作用对象是数组,

通过.call()改变它的作用对象,让它为一个对象或类数组对象。

通过call或apply的方式,更改当前的调用者,有没有一种方式让当前的函数不局限于当前的调用者本身,让函数更具有通用性。

Function.prototype.uncurrying = function() {
    let fn = this;
    return function () {
        let _this = Array.prototype.shift.call(arguments);// this是arguments的第一个参数
        return fn.apply(_this,arguments);
    }
}
let push = Array.prototype.push.uncurrying(); // 它是函数的方法,函数是个实例对象,就需要在Function.prototype上绑定方法
let obj = {};
console.log(push(obj, 'first', 'second'));
console.log(obj);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值