我是靠谱客的博主 阳光大地,最近开发中收集的这篇文章主要介绍callee和caller,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在之前的文章中我说到了arguments,现在来说一下他的属性callee和一个长得相似的双胞胎弟弟caller:

首先说callee,来一段代码:

    var a=function(){
        console.log(arguments.callee);
    }
    var b=function(){
        a()
    }
    b();
这段代码在chrome中输出的是:

ƒ (){
        console.log(arguments.callee);
    }
这个函数和a函数是不是一模一样?

callee返回正在执行的函数本身的引用。callee是arguments的一个属性,这个属性是一个指针,指向这个拥有arguments对象的函数,arguments是调用函数,那么这个callee就是调用函数的啦)
首先我们来说一个用callee解决的例子,阶乘的计算:
  function factorial(num){
        if(num<=1){

        }else{
            return num*factorial(num-1);
        }
    }
上面的代码是用的是函数名。上述方法会增强耦合性,为了降低耦合性我们就用callee,而且无论引用函数的时候是什么名字都可以完成递归调用。看看callee:

   function factorial(num){
        if(num<=1){
            return 1;
        }else{
            return num*arguments.callee(num-1);
        }
    }

caller:和他相似的我们还有一个caller,es5中规范化了另外一个函数对象属性caller这个属性中保存着调用当前的函数的函数引用,如果是全局作用于中调用当前的函数就返回null
    
function outer(){
        inner();
    }
    function inner(){
1.      alert(arguments.callee.caller);
  2.      alert(inner.caller)
        //上面的这两行是一样的1比2 的耦合性更松散
     3.   alert(arguments.caller);//undefined
//        3.这行代码在严格模式下会报错,但是非严格模式下就是undefined
    }
    outer();
//    说是定义argumnets.callee属性是为了分清qrguments.caller和caller
//    属性严格模式下不能为caller属性赋值,不然报错
    // var a=function(){
    //     alert(a.caller);
    // }//定义一个函数。里面输出a.caller
    // var b=function(){
    //     a();
    // }//定义一个函数调用那个a函数;
    // b();//输出b函数。
上面的例子中,是调用的b根据caller的特性就知道了答案。
    // var a=function(){
    //     alert(a.caller);
    // }//定义一个函数。里面输出a.caller
    // var b=function(){
    //     a();
    // }//定义一个函数调用那个a函数;
    // a();//null(a在任何函数中被调用,即为顶层函数,输出的就是null),上面的例子一中,a函数是在b中调用的所以不是顶层不反悔null,返回当前的调用就是b函数啦,而这个例子是在全局中调用的自然是null

最后一个例子帮助深刻地理解顶层:要是a中也有了一个函数
var c=function(){
    alert(c.caller);
}
var a=function(){
    c()
    alert(a.caller);
}
var b=function(){
    a();
}
a();
这个例子在c中的alert出来的是a函数,原因是在a中调用。
a中alert出来的是null,毕竟你是在全局中调用的a的函数。b函数相当于没有用。
好了,这么多例子都不懂的话,可能是我写的太差吧。



最后

以上就是阳光大地为你收集整理的callee和caller的全部内容,希望文章能够帮你解决callee和caller所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部