JavaScript curry

前端 未结 5 760
我在风中等你
我在风中等你 2020-12-14 11:32

I`m a newbie at JavaScript trying to understand this tutorial about currying from Oreilly JavaScript Cookbook.

Could someone be kind enough to explain this program i

5条回答
  •  有刺的猬
    2020-12-14 11:46

    // define the curry() function
    function curry(fn, scope) {
    
        // set the scope to window (the default global object) if no scope was passed in.
        scope = scope || window;
    
        // Convert arguments into a plain array, because it is sadly not one.
        // args will have all extra arguments in it, not including the first 2 (fn, scope)
        // The loop skips fn and scope by starting at the index 2 with i = 2
        var args = [];
        for (var i = 2, len = arguments.length; i < len; ++i) {
            args.push(arguments[i]);
        }
    
        // Create the new function to return
        return function() {
    
            // Convert any arguments passed to the this function into an array.
            // This time we want them all
            var args2 = [];
            for (var i = 0; i < arguments.length; i++) {
                args.push(arguments[i]);
            }
    
            // Here we combine any args originally passed to curry, with the args
            // passed directly to this function.
            //   curry(fn, scope, a, b)(c, d)
            // would set argstotal = [a, b, c, d]
            var argstotal = args.concat(args2);
    
            // execute the original function being curried in the context of "scope"
            // but with our combined array of arguments
            return fn.apply(scope, argstotal);
        };
    }
    
    // Create a function to be curried
    function diffPoint(x1, y1, x2, y2) {
        return [Math.abs(x2 - x1), Math.abs(y2 - y1)];
    }
    
    // Create a curried version of the diffPoint() function
    //   arg1: the function to curry
    //   arg2: the scope (passing a falsy value causes the curry function to use window instead)
    //   arg3: first argument of diffPoint() to bake in (x1)
    //   arg4: second argument of diffPoint() to bake in (y1)
    var diffOrigin = curry(diffPoint, null, 3.0, 4.0);
    
    // Call the curried function
    // Since the first 2 args where already filled in with the curry, we supply x2 and y2 only
    var newPt = diffOrigin(6.42, 8.0);
    

    In this case the scope argument isn't used at all. scope sets what the this object is. The function you are currying doesn't use this so it has no real effect. The scope is set when fn.apply(scope, args) is called, which both sets the scope to run in and provides arguments to pass in.

提交回复
热议问题