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);
  • 相关阅读:
    《构建之法》阅读有疑 与 个人Week1作业
    版本管理和项目管理软件浅谈
    [2019BUAA软工助教]第0次个人作业
    [2017BUAA软工助教]博客格式的详细说明
    [2017BUAA软工助教]收集个人信息
    最长英文单词串题目分析
    蓝桥杯PREV-11:横向打印二叉树
    day2
    冯如杯day1
    个人阅读作业
  • 原文地址:https://www.cnblogs.com/lambdatea/p/3388294.html
Copyright © 2011-2022 走看看