柯里化

作者: wudimingwo | 来源:发表于2019-01-06 21:43 被阅读0次
    image.png

    封装柯里化函数

                function FixedParmasCurry (fn) {
                    
                    var args = [].slice.call(arguments,1);
                    
                    return function () {
                        var newArg = args.concat([].slice.call(arguments,0))
                        return fn.apply(this,newArg);
                    }
                }
                
                function curry (fn,length) {
                    var length = length || fn.length;
                    
                    return function () {
                        if (arguments.length < length) {
                            var combine = [fn].concat([].slice.call(arguments));
                            return curry(FixedParmasCurry.apply(this,combine),length - arguments.length);
                        }else {
                            return fn.apply(this,[].slice.call(arguments))
                        }
                    }
                    
                }
    
    image.png
    image.png

    其实curry 的封装 非常牛逼
    我们试着把上面的给合并在一起写一下

                function curry(fn, length) {
                    var length = length || fn.length;
    
                    return function() {
                        if(arguments.length < length) {
                            var combine = [fn].concat([].slice.call(arguments));
                            return curry(function() {/这里是递归调用curry
                                var args = [].slice.call(arguments, 1);
                                return function() {
                                    var newArg = args.concat([].slice.call(arguments, 0))
                                    return fn.apply(this, newArg);
                                }
    
                            }.apply(this,combine), length - arguments.length);
                        } else {
                            return fn.apply(this, [].slice.call(arguments))
                        }
                    }
    
                }
    

    这简直他娘的是一种艺术
    柯里化到底干的是什么?
    柯里化就是让参数分离, 如果参数不够,就继续延迟执行,
    但传入的参数, 都必须和功能进行绑定.
    length 是用来判定 参数够没够数.
    这里的关键是,
    怎么让一个功能先绑定一些参数, 但又能流出接口可以继续接收参数?

    上面的柯里化能不能简化?

                function curry(fn, length) {
                    var length = length || fn.length;
    
                    return function() {
                        if(arguments.length < length) {
                            var args = [].slice.call(arguments);
                            return curry(function() {
                                    var newArg = args.concat([].slice.call(arguments, 0))
                                    return fn.apply(this, newArg);
                            }, length - arguments.length);
                        } else {
                            return fn.apply(this, [].slice.call(arguments))
                        }
                    }
    
                }
    
    
    

    这也能行. 不过比上面的没那么精妙.

    相关文章

      网友评论

          本文标题:柯里化

          本文链接:https://www.haomeiwen.com/subject/atmsrqtx.html