深入学习javascript:函数的套接

part 1:函数的套接是什么东西?

这是在《javascript精粹》中看到的概念,书上也没给出具体的定义。据我的理解,参数值在从第一一个函数中传递到第二个函数,然后与第二个函数的参数值一起参与运算,有点像接力的意思。

 

part 2:code 

firstFun=function(){
    sum=0;
    var i;
    for(i=0;i<arguments.length;i++){
        sum+=arguments[i];
    }
    return sum;
}
firstFun.curry=function(){
    var arg=arguments;   //第一个函数的参数列表
    var that=this;         //指向第一个函数,可被执行
    var slice=Array.prototype.slice;
    return function(){
    return that.apply(null,slice.apply(arg).concat(slice.apply(arguments)));
    }
}
secondFun=firstFun.curry(1,2,3);

document.write(secondFun(4,5,6)) 

首先这段代码的输出结果是1+2+3+4+5+6=21。

part3:分析

从secondFun(4,5,6)开始,必须要搞清楚的就是secondFun()函数。

secondFun()的定义是 secondFun=firstFun.curry(1,2,3)。也就是说secondFun是firstFun.curry(1,2,3)的返回结果,而看firstFun.curry的定义可知,它返回一个函数。所以,调用secondFun(4,5,6)就是调用

function(){
return that.apply(null,slice.apply(arg).concat(slice.apply(arguments)));

这个函数,而观察这个函数的上下文可知,that指的是firstFun这个函数,所以that.apply()就是firstFun()。再分析参数slice.apply(arg).concat(slice.apply(arguments)),slice指的是Array.prototype.slice,slice.apply(arg)的作用就是把arg变成一个数组,后面的slice.apply也是同样的用意,而arg呢,它是firstFun的参数,arguments是secondFun的参数,所以整句话的意思就是把两个参数列表连起来。即[1,2,3]+[4,5,6]。之所以这么麻烦,是因为函数的arguments参数不是数组,没有concat方法,所以有了这样一步的处理。所以,上面那句话其实就是firstFun([1,2,3,4,5,6])。现在再看firstFun的定义,就可得到21这个结果了。

这段代码的难点在于对闭包的理解。 内部函数是保留对外部函数相关变量的引用的,即使外部函数已经执行完毕。

posted @ 2012-02-26 19:03  orchid  阅读(315)  评论(0编辑  收藏  举报