为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript 柯里化函数疑惑

JavaScript 柯里化函数疑惑

GCT1015 2019-02-04 21:24:27
下面的柯里化函数不太理解,为什么可以实现fn(1, 2, 3, 4) => fn(1)(2)(3)(4)()这样类似的柯里化转化?可以详细解释一下吗?// 柯里化 wrappervar currying = function(fn){    var args = [];    return function(){        if(!!arguments.length) {            [].push.apply(args, arguments);            return arguments.callee;        } else {            return fn.apply(this, args);        }    }}// 累加var sum = (function(num){    var ret = 0;    return function(){        for(var i = 0, len = arguments.length; i < len; i++) {            ret += arguments[i];        }        return ret;    }})();     var newSum = currying(sum);newSum(1)(2)(3)(4)()  // 10、// 查询数组中是否存在某个值var find = function(arr, el){  return arr.indexOf(el) !== -1;}var newFind = currying(find)(arr);newFind(1);newFind(2);
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

使用了闭包的特性,args用于保存每次调用是传入的参数, arguments.callee就是currying 

每次传入参数时保存在args数组里面,并返回一个函数(就是函数自己currying),因此才可以继续调用;当没有参数传入时,则执行fn


// 柯里化 wrapper

var currying = function(fn){

    var args = [];

    return function(){

        if(!!arguments.length) {

            // 将传入的参数push进args变量

            [].push.apply(args, arguments);

            // 传入一个参数时,返回一个函数

            return arguments.callee;

        } else {

            // 没有传入参数时执行fn

            return fn.apply(this, args);

        }

    }

}


查看完整回答
反对 回复 2019-02-14
  • 1 回答
  • 0 关注
  • 457 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号