zoukankan      html  css  js  c++  java
  • js问题解释

    今天群里有人问一个js问题,现列出以便其他人参考。

    Function.prototype.curry=function(){
        var slice=Array.prototype.slice,
            args=slice.apply(arguments),
            that=this;
        return function(){
            console.log(args.concat(slice.apply(arguments)))
             return that.apply(null, args.concat(slice.apply(arguments)) );
        }  
    }
    function add(a,b){
       return a+b;
    }
    var q=add.curry(10);
    q(2)

    这里我将代码改变了一下,便于解析:(其实就是:函数与传递给它的参数组合产生新函数。)
    改变:
    Function.prototype.curry=function(){
        var slice=Array.prototype.slice,
            args=slice.apply(arguments),// 参数变为数组,以便使用concat
            that=this;
        return function(){
             var param = slice.apply(arguments).concat(args);
             console.log(param)
             return that.apply(null, param );
        }  
    }
    function add(a,b){
       return a+b;
    }
    var q=add.curry(10);
    q(2)

    分析:

    首先add.curry(10);,curry最终返回了一个function,并且这个function是闭包(因为内部使用的变量名是上面的add的变量,即引用了但不释放变量):
    var slice=Array.prototype.slice;//将要使用slice方法,这里简写引用
    args=slice.apply(arguments),// add函数的参数变为数组,以便使用数组的concat方法
    that=this;//存放add的引用。。
    执行q(2)则内部执行过程:
    var param = slice.apply(arguments).concat(args);显然这里slice和args都是add函数的引用(闭包用上了),而arguments则是q的参数。含义:q的参数调用数组的slice方法,然后与前面保存add的args数组进行连接。
    return that.apply(null, param ); 现在新数组[2,10]作为参数调用add的方法(that的引用),返回结果。

  • 相关阅读:
    [LeetCode] 134. Gas Station Java
    [LeetCode] 22. Best Time to Buy and Sell Stock II Java
    [LeetCode] 55. Jump Game Java
    [LeetCode] 264. Ugly Number II Java
    [LeetCode] 331. Verify Preorder Serialization of a Binary Tree Java
    [LeetCode] 232. Implement Queue using Stacks Java
    java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory的解决办法
    Linux centos 连接网络
    MyEclipse默认编码为GBK,修改为UTF8的方法
    表单
  • 原文地址:https://www.cnblogs.com/yuzhongwusan/p/3554285.html
Copyright © 2011-2022 走看看