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返回值是谁调用了这个函数,就返回那个调用者,如果自己调用自己,就返回null callee是argum...
    你听cmy1994阅读 3,845评论 1 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,267评论 0 4
  • Function.caller 返回调用指定函数的函数。如果一个函数f是在全局作用域内被调用的,则f.caller...
    马里奥Joseph阅读 6,570评论 3 12
  • 这两天在查阅资料的时候发现了一些之前没见过的小内容 1.caller 这个方法一般来说用的很少,就简单的介绍一下 ...
    殷灬商阅读 486评论 1 1
  • 在js中,函数本身属于对象的一种,因此可以定义、赋值,作为对象的属性或者成为其他函数的参数。函数名只是函数这个对象...
    bjhu电net阅读 552评论 0 5