caller和callee

关键词

  • 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)