首页 > Web开发 > 详细

js问题解释

时间:2014-02-18 22:20:24      阅读:429      评论:0      收藏:0      [点我收藏+]

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

bubuko.com,布布扣
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)
bubuko.com,布布扣

这里我将代码改变了一下,便于解析:(其实就是:函数与传递给它的参数组合产生新函数。)
改变:
bubuko.com,布布扣
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)
bubuko.com,布布扣

 

分析:

首先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的引用),返回结果。

js问题解释

原文:http://www.cnblogs.com/yuzhongwusan/p/3554285.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!