JavaScript 柯里化函数疑惑

发布于 2022-09-06 00:58:00 字数 808 浏览 9 评论 0

下面的柯里化函数不太理解,为什么可以实现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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

◇流星雨 2022-09-13 00:58:00

使用了闭包的特性,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);
        }
    }
}
魔法唧唧 2022-09-13 00:58:00
var currying = function(fn){
    var args = [];
    return function(){
        if(!!arguments.length) {
            // 此处判断传入参数长度,如果长度不为0,则进入此处
            // 通过args数组保存下来
            [].push.apply(args, arguments);
            // 返回arguments.callee进行自身递归调用
            return arguments.callee;
        } else {
            // 最后没有传入参数时进入此处
            // 利用apply方法在函数内调用传入的fn,并将之前保留下来的args参数数组传入
            return fn.apply(this, args);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文