zoukankan      html  css  js  c++  java
  • js callee,caller学习

    原文地址:js callee,caller学习

    /*
    * caller 返回一个对函数的引用,该函数调用了当前函数。
    * 如果函数是由顶层调用的,那么 caller包含的就是 null 。
    * 如果在字符串上下文中使用 caller属性,那么结果和 functionName.toString
    * 一样,也就是说,显示的是函数的反编译文本。

    * 在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,则caller为null。

    */

    function callerDemo() {
    if (callerDemo.caller) {
    // var a= callerDemo.caller.toString();
    // alert(a); 
    //等价于下面表达式
    alert(callerDemo.caller);
    } else {
    alert("this is a top function");
    }
    }
    function handleCaller() {
    callerDemo();
    }
    // handleCaller();	
    // callerDemo();
    

      

    /*-------------------------------------------------------
    * callee 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
    * callee属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,
    * 这有利于匿名函数的递归或者保证函数的封装性
    * 该属性仅当相关函数正在执行时才可用
    * arguments.length是实参长度,arguments.callee.length是形参长度,
    * 由此可以判断调用时形参长度是否和实参长度一致。
    */

    function calleeDemo() {
    // alert(n);
    // arguments.callee(n-1);
    alert(arguments.callee);
    }
    // calleeDemo(); //返回函数toString形式
    
    //递归计算
    var sum = function(n){
    if (n <= 0) 
    return 1;
    else
    return n + arguments.callee(n - 1);
    // arguments.callee调用当前正在执行的函数,即sum本身!
    }
    // alert(sum(3));
    

      

    /*----------------------------------------
    * 二者区别
    */

    function inner(){
    alert(arguments.callee);//指向拥有这个arguments对象的函数,即inner()
    alert(arguments.callee.caller);//这个属性保存着调用当前函数的函数的引用,即outer()
    }
    function outer(){
    inner();
    }
    // outer();//先弹出inner()函数再弹出outer()函数本身内容!
    

    参考:理解JavaScript中的arguments,callee,caller,apply 

    JavaScript 之arguments、caller 和 callee 介绍

  • 相关阅读:
    Java反射中Class.forName与classLoader的区别
    Java各种成员初始化顺序
    crontab python脚本不执行
    Java mybatis缓存(转)
    Java Synchronized及实现原理
    JVM类加载器
    SSH掉线问题
    SSH登陆远程卡、慢的解决的办法
    shell脚本执行python脚本时,python如何将返回值传给shell脚本
    使用scrapy进行数据爬取
  • 原文地址:https://www.cnblogs.com/jhmydear/p/4618036.html
Copyright © 2011-2022 走看看