zoukankan      html  css  js  c++  java
  • JavaScript Curry

     感觉就是C++中的 functor+bind.

    http://stackoverflow.com/questions/5176313/javascript-curry

    // 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);
  • 相关阅读:
    Linux设备模型 学习总结
    平衡二叉树
    数字在排序数组中出现的次数
    两个链表的第一个公共节点
    第一个只出现一次的字符
    丑数
    把数组排成最小的数
    剑指offer 连续子数组的最大和
    查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
    for each
  • 原文地址:https://www.cnblogs.com/lambdatea/p/3388294.html
Copyright © 2011-2022 走看看