caller和callee

作者: ferrint | 来源:发表于2017-02-27 12:03 被阅读6次

    关键词

    • caller :返回一个函数的引用,这个函数调用了当前的函数
    • callee:返回正在执行的函数本身的引用,它是arguments的一个属性

    下面我们做个小demo

      var a = function() { 
      if(a.caller){
              console.log(a.caller);    
          }else{
              console.log("没有执行"); 
          }    
      } 
      a();  // 没有执行
      var b = function() {   
           a();   
      }   
      b();  // 返回函数
    

    只用在非顶层调用的时候,caller才有值


    callee有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致

        //用于验证参数
        function calleeLengthDemo(arg1, arg2) {
            if (arguments.length == arguments.callee.length) {
                console.log("验证形参和实参长度正确!");
                /*return;*/
            } else {
                console.log("实参长度:" + arguments.length);      //实参长度:4
                console.log("形参长度: " + arguments.callee.length);    //形参长度:2
            }
        }
        calleeLengthDemo(1,2,3,4);
    

    根据 callee 的特性,还可以用来递归匿名函数

        //一般递归
        var sum = function(n) {
            if (n == 1) return 1;
            return n + sum(n - 1);
        };
        console.log(sum(100));
    
        //callee递归
        var sum1 = function (n) {
            if (n == 1){
                return 1;
            }else{
                return n + arguments.callee(n - 1);
            }
        };
        console.log(sum1(100));
    

    js 中还有个bind方法,也能有上面的效果

    var person = { 
    name: '段王爷', 
    job: '大理国王', 
    gender: '男的', 
    show: function() { 
    return  this.name  + this.job + this.gender; 
    } 
    } 
    console.log(person.show()); 
    var reShow = person.show.bind({ 
    name:'段誉', 
    job: '花花公子' 
    }); 
    console.log(reShow()); 
    

    相关文章

      网友评论

        本文标题:caller和callee

        本文链接:https://www.haomeiwen.com/subject/lllzwttx.html