zoukankan      html  css  js  c++  java
  • javascript中caller和callee的用法。

    看下作用:
    functionName.caller 获取调用当前函数的函数 
    arguments.callee 返回正在被执行的function对象,即指定对象的原文 


    先说callee,因为用的地方可能多一些。

    废话不说了,直接上代码


    ```
    function a(x){

    if(x<=1)
    return x;
    else
    return x + a(x-1);
    }
    a(12) // 78
    // 这是一个极简的递归,运行结果正常。
    // 再看看下面的调用方法
    var b = a;
    a = null; // 将a回收
    b(12); // erro : 'a' is not a function
    ```
    原因也简单,b=a,b=function a(){};在b调用之前,我们用了a=null。所以在 function a 运行的时候,其中的return x + a(x-1);中的a,指向的就是null,而不是 function a。
    所以就报错了,如何解决这样的问题。我们将a换一种写法
    ```
    function a(x){
      if(x<=1)
        return x;
      else
        return arguments.callee(x-1); // 这句是改变的地方
    }
    // 再调用
    var b = a;
    a = null;
    b(12); // 78
    ```


    原因:虽然我们将a=null了,但是函数a中并没有用到a,而是通过arguments.callee指向当前函数。
    因为arguments.callee的定义就是:返回正在执行的函数。
    ====================







    再看 functionName.caller
    caller指向调用当前函数的函数,但是有一点,如果是在全局作用域内(即顶层window)被调用,则返回null。
    代码走起
    ```
    function testCaller(){
      if(testCaller.caller == null){
        console.log('accessed at global');
      }else{
        console.log('accessed at ' + testCaller.caller);
      }
    }
    // 在全局调用
    testCaller(); // accessed at global
    // 在一个函数中调用
    function a(){
      testCaller();
    }
    a(); // accessed at function a(){testCaller();} 此时,testCaller.caller指向就是 function a
    ```


    说完
    参考资料
    http://msdn.microsoft.com/zh-cn/library/334e1zza(v=vs.94).aspx
    http://msdn.microsoft.com/zh-cn/library/7t96kt3h(v=vs.94).aspx
    https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Function/caller
  • 相关阅读:
    Storm
    Linux 网络配置
    .NET Remoting
    jwt
    new操作符
    元数据
    C# lock
    三十而立
    面试
    灯火
  • 原文地址:https://www.cnblogs.com/CoinXu/p/3686047.html
Copyright © 2011-2022 走看看