zoukankan      html  css  js  c++  java
  • callee和caller属性的区别

      在函数内部,有两个特殊的对象:arguments和this 。arguments是一个类数组对象,用于存放传入函数中的所有参数。

      callee是arguments对象的属性,caller是所有函数对象的属性。

    callee

    callee是一个指针,指向拥有当前arguments对象的函数,即返回正在执行的函数本身的引用

    使用callee时要注意:
    1 这个属性只有在函数执行时才有效
    2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length(实参长度)是否等于arguments.callee.length(形参长度)
    3 它可以用来递归匿名函数或者保证函数的封装性。

    //callee可以打印其本身
    function calleeDemo() {
        alert(arguments.callee);
    }
    //用于验证参数
    function calleeLengthDemo(arg1, arg2) {
        if (arguments.length == arguments.callee.length) {
            window.alert("验证形参和实参长度正确!");
            return;
        } else {
            alert("实参长度:" + arguments.length);
            alert("形参长度: " + arguments.callee.length);
        }
    }
    //递归计算
    var sum = function (n) {
        if (n < = 0)
            return 1;
        else
            return n +arguments.callee(n - 1)
    }

    举个例子

    var a = function() {   
    alert(arguments.callee);   
    }   
    var b = function() {   
    a();   
    }   
    b();      //function() {  alert(arguments.callee); } 

    a在b中被调用,但是它返回了a本身的引用。

    caller

    caller返回一个对函数的引用,该函数调用了当前函数。即这个属性中保存着调用当前函数的函数的引用。

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

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

    举个例子

    var a = function() {   
    alert(a.caller);   
    }   
    var b = function() {   
    a();   
    }   
    b();    // function() {  a(); }
    
    a();    // null

    上面的代码中,b调用了a,那么a.caller返回的是b的引用。

    但是,如果直接调用a(即a在任何函数中被调用,也就是顶层调用),返回null。

  • 相关阅读:
    【eoe资源】通过片段创建灵活的用户界面
    史上最全的Android开发索引帖
    临时记录
    五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
    【转】深入探讨 Android 传感器
    Java Collections Framework Java集合框架List,Map,Set等全面介绍之概要篇
    谷歌 G1 android APK安装器 离线安装软件
    【转】請為你的 Android 程式加上 obfuscation 吧!
    【转】Android Toolchain与Bionic Libc
    用VirtualBox在XP环境下虚拟Ubuntu的过程
  • 原文地址:https://www.cnblogs.com/guorange/p/6652102.html
Copyright © 2011-2022 走看看