JavaScript中的callee与caller的区别

1.callee

callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数

1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。


作用:就是用来指向当前对象

先来看一个阶乘函数:

1
2
3
4
5
6
7
function Aaa(x){
     if(x<=1){
        return 1;
}else{
        return x*Aaa(x-1);
}
}

可以看到用到了递归函数

但是问题来了,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试 

1
2
3
4
5
6
7
function Aaa(x){
      if(x<=1){
         return 1;
}else{
         return x*arguments.callee(x-1);
}
}


 根据callee的定义,可以看出来callee是arguments对象的一个属性,指向arguments对象的函数,这个函数就是Aaa(Aaa=arguments.callee

2.caller

caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用指向当前函数的直接父函数

1 这个属性只有当函数在执行时才有用
2 如果在JavaScript程序中,函数是由顶层调用的,则返回null

functionName.caller: functionName是当前正在执行的函数。



返回一个对函数的引用,该函数调用了当前函数。

functionName.caller

functionName 对象是所执行函数的名称。

注意:

对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。

栗子:

1
2
3
4
5
6
7
8
function a(){//父函数
     b();
     };
     function b(){
     console.info(b.caller);
     };
 
     a(); //结果就是弹出函数a和内容

 结果是:

 

可以看到函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a

 3.将callee和caller结合起来使用

1
2
3
function b(){
alert(b.caller);
};

  从这个代码可以看出b函数中调用了b函数名,这样当函数名改变时就很不方便我们需要替换里面的那个b
  前面我们知道用什么方法可以指向当前对象,下面我们就来修改一下:

1
2
3
4
5
6
7
(function a(){
b();
})();
  
function b(){
alert(arguments.callee.caller);//用arguments.callee代替了b
};

4.实例:斐波那契数列(用了递归思想)

如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var result=[];
         function fn(n){
            if(n==1){
                 return 1;
             }else if(n==2){
                 return 1;
             }else {
                 if(result[n]){
                     return result[n];
                 }else{
                     //arguments.callee(...)=fn(...)
                     result[n]=arguments.callee(n-1)+arguments.callee(n-2);
                     return result[n];
                 }
             }
         }

  

 参考文档:

 https://i.cnblogs.com/EditPosts.aspx?postid=5718633

 http://www.jb51.net/article/64390.htm

 http://www.cnblogs.com/susanws/p/5715214.html


原文地址: http://www.cnblogs.com/GumpYan/p/5718633.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值