函数柯里化

 

 

一、简单题目add (a,b)改写add(a)(b)

// 普通的add函数
function add(x, y) {
    return x + y
}

add(1,2);

 

carray之后:

//carry
function add (x) {
    return function(y) {
        return x + y;
    }
}
add(2)(3)

二、函数柯里化通用函数

 

答:

function add(...args) {
    return args.reduce((sums, i) => sums + i);
}

function carrying(fn, ...args1) {
    return function (...args2) {
        return fn.call(this, ...args1, ...args2);
    }
}
carrying(add,1)(2);

三、实现bind函数

Function.prototype.bind = Function.prototype.bind || 
function (context, ...args1) {
    var _this = this
 
    return function(...args2) {
        return _this.call(context, ...args1, ...args2)
    }
}
// bind,实现的机制就是Currying.

扩展:Bind()的应用

题目:

    var a  = {

      name: 'a',

      getName: function () {

      console.log(this.name);

      }

      }

      var b = {

      name : 'b'

      }

      var c =  {

      name: 'c'

      }

      var fn1 = a.getName.bind(b);

      var fn2 = a.getName.bind(b).bind(c);

问:执行下面语句分别打印什么

      fn1();

      fn2();

      a.getName();

答:

VM61:4 b

VM61:4 b

VM61:4 a

四、多参数调用

1.形如:carryAdd(a),curryAdd(b),curryAdd(c),curryAdd();

答1

var currying = function (fn, ...args1) {
    var args = [...args1] || [];
    var self = this;
    return function (...args2) {
        if (args2.length === 0) {
            return fn.apply(self, args);
        } else {
            args.push(...args2);
            return currying.call(self, fn, ...args);
        }
    }
};

 

答2: 

var currying = function (fn, ...args1) {
    var args = [...args1] || [];
    return function () {
        if (arguments.length === 0) {
            return fn.apply(this, args);
        } else {
            args.push(...arguments);
            return arguments.callee;
        }
    }
};

形如:​​​​​​​carryAdd(a)(b)(c);

var args = [].slice.call(arguments);
return args.reduce((sums, i) => sums + i);

}
var currying = function (fn, ...args1) {
    var args = [...args1] || [];
    var self = this;
    return function (...args2) {
        args.push(...args2);
        if (args.length >= fn.length) {
            return fn.apply(self, args);
        }

        return currying.call(self, fn,...args)

    }
}
currying(add, 1)(2)(3)

function add(x, y, z) {
    var args = [].slice.call(arguments);
    return args.reduce((sums, i) => sums + i);

}
var currying = function (fn, ...args1) {
    var args = [...args1] || [];
    return function () {
        args.push(...arguments);
        if (args.length >= fn.length) {
            return fn.apply(this, args);
        } else {
            return arguments.callee;
        }
    }
};

currying(add, 1)(2)(3)

五、编程题

1.题目

// 实现一个add方法,使计算结果能够满足如下预期:

add(1)(2)(3) = 6;

add(1, 2, 3)(4) = 10;

add(1)(2)(3)(4)(5) = 15;

function add(...args1) {
    // 第一次执行时,定义一个数组专门用来存储所有的参数
    var _args = [...args1];
    // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    var _adder = function () {
        _args.push(...arguments);
        return _adder;
    };

    // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
    _adder.toString = function () {
        return _args.reduce( (a, b) => a + b);
    }
    return _adder;
}

题2:sum(1)(2)(3).valueOf()

function sum(...args1) {
    var args = [...args1] || [];
    var innerfn = function (...args2) {
        args.push(...args2);
        return innerfn;
    }
    innerfn.valueOf = function () {
        return args.reduce((items, item) => items + item);

    }
    return innerfn;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值