猿问

JavaScript 柯里化函数疑惑

下面的柯里化函数不太理解,为什么可以实现fn(1, 2, 3, 4) => fn(1)(2)(3)(4)()这样类似的柯里化转化?可以详细解释一下吗?

// 柯里化 wrapper

var 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);


GCT1015
浏览 458回答 1
1回答

慕雪6442864

使用了闭包的特性,args用于保存每次调用是传入的参数, arguments.callee就是currying&nbsp;每次传入参数时保存在args数组里面,并返回一个函数(就是函数自己currying),因此才可以继续调用;当没有参数传入时,则执行fn// 柯里化 wrappervar currying = function(fn){&nbsp; &nbsp; var args = [];&nbsp; &nbsp; return function(){&nbsp; &nbsp; &nbsp; &nbsp; if(!!arguments.length) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 将传入的参数push进args变量&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [].push.apply(args, arguments);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 传入一个参数时,返回一个函数&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return arguments.callee;&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 没有传入参数时执行fn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return fn.apply(this, args);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答