zoukankan      html  css  js  c++  java
  • 深入学习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这个结果了。

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

  • 相关阅读:
    fiddler的使用
    redis pipeline
    redis hash map
    redis队列的实现
    PHP-redis中文文档-命令
    websocket
    c++之socket,阻塞模式
    Django上传文件和修改date格式
    通过字符串导入模块
    'CSRFCheck' object has no attribute 'process_request' 报错
  • 原文地址:https://www.cnblogs.com/orchid/p/2368923.html
Copyright © 2011-2022 走看看