zoukankan      html  css  js  c++  java
  • arguments .length .callee caller

    如果有一个函数像下面这样:

    function fn(){
    
    }

    那么fn这个函数下面就有一个arguments属性(你在逗我么,后面又说对象),该属性是个对象(typeof一下就知道了),然后它下面也有属性;

    说到arguments有属性,那么属性有什么呢,恩~下面就介绍其中一个属性:callee;先看怎么用吧:

    function fn(){
    
      alert( arguments.callee )
    
    }
    fn();

    执行结果弹出:function fn(){alert( arguments.callee )},仔细看,其实就是得到fn这个函数自身。

    至于这个的用处嘛,需要在函数里再次使用自身函数的时候(尤其是匿名函数呢),我想用的比较的多地方应该是做【递归】运算的时候,比如说老生常谈的一个例子,求10的阶乘:

        function fn(num){
            
          if(num==1){
            
            return 1
        
          }else{
            
            return num*arguments.callee(--num)
        
          }
        }
        
        console.log( fn(10) )

    结果不显而易见:3628800;恩~这个不是重点,重点是上面用到了arguments.callee这个东西(该叫它属性呢?还是方法呢?还是东西吧,这个绝对没错,苦笑╮(╯_╰)╭)

    这个例子的话还是算了,打动不了我学这个方法的心,哎,那就来个比较实用的吧,给本地对象Array添加一个方法 - 将多维数组转换成一维数组:

        if(!Array.prototype.toSingle){
            Array.prototype.toSingle=function(){    //将多维数组转换成一维数组
                return (function(aData){
                            for(var i=0, len=aData.length, arr=[]; i<len; i++){
                                arr=arr.concat( Array.isArray(aData[i]) ? arguments.callee(aData[i]) : aData[i] )
                            }
                            return arr
                        })(this)
            }
        }

    恩~这个还可以。使用一下试试:

    console.log( [[1,2,[3,4,[1,-5,-9,0,2,56],5]],[2,5],50].toSingle() )

    结果显而易见了:[1, 2, 3, 4, 1, -5, -9, 0, 2, 56, 5, 2, 5, 50];

    好像还没介绍arguments对象,那就和它的另一个属性length一起说吧,

    arguments:(还)表示函数的实参列表,再说的通俗易懂点就是表示一个函数的实际参数的列表,

    arguments.length:表示实参列表的长度。

        function fn(a,b,c,d){
            alert( a )
            alert( arguments.length )
            alert( arguments[0] )
        }
        fn(8,9)
    结果先不管,像上面这样,a,b,c,d就是函数【fn】的形参 -- 形式上的参数,而【fn】函数实际上呢只传进了2个参数:8,9;所以arguments.length就等于2,arguments就是相当于数组[8,9];所以不想用a,b来得到8,9的话还可以用arguments[0]得到【8】,
    arguments[1]得到【9】;但是arguments不是数组,不能对它使用shift、push、join等方法。上面的执行结果:
        alert( a )    // 8
        alert( arguments.length )    // 2(个)
        alert( arguments[0] )    // 8
    
    
    ●然后(最后)就是caller了,重新来个函数吧,假设现在有一个函数【a】:
        function a(){
         }

    caller是什么?怎么使用?  caller是函数【a】下面的一个方法,这样使用↓:

        function a(){
          alert( a.caller )       
        }
        a();

    结果:null,就是空!caller表示:返回调用【a】函数的函数,很明显,a没有被任何函数调用,或者说没有在任何函数里面被使用一下。

    那么使用一下是怎么样的呢↓:

        function a(){
            alert( a.caller )
        }
        function b(){
            a()
        }
        b()

    这样就会弹出函数【b】:

    function b(){
       a()
    }
    毋庸置疑,刚才都说了,a.caller返回调用【a】函数的函数,很明显,【a】函数在【b】函数里被调用了!
    恩~刚刚才了解了arguments.cellee,这里是不是可以试试手捏╮(╯▽╰)╭(jiranmeiyoudonghuabiaoqing!_!),像这样:
        function a(){
            alert( arguments.callee.caller )
        }
        function b(){
            a()
        }
        b()
    嗦嘎,结果还是上面的function b(){a()},孺子可教也呀。
    师傅,话说caller的实际用处呢,是不是不大!恩~好像是这样的,为师也没怎么用到过***

     

  • 相关阅读:
    cocos2dx-基本动画制作
    cocos2dx-CCScrollView的制作
    回调函数的作用
    cocos2dx-Action动作
    cocos2dx-cpptest的结构
    重载函数
    .h和.cpp的用法与区别
    NDK配置之体会
    Cocos2d-x 3.1 内存管理机制
    idea spring boot
  • 原文地址:https://www.cnblogs.com/barrior/p/4430194.html
Copyright © 2011-2022 走看看