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。

  • 相关阅读:
    倍增或线段树,给出一个数,让它模一连串的数
    江西财经大学第一届程序设计竞赛
    L2-027. 名人堂与代金券
    hdu 3038 给区间和,算出多少是错的
    cf166e 在四面体上寻找路线数 递推,取模
    cf946d 怎样逃最多的课dp
    PAM练习
    PAM模板
    E. Erase Subsequences dp
    CSU2004:Finding words(含指定不相交前后缀的模式串计数)
  • 原文地址:https://www.cnblogs.com/guorange/p/6652102.html
Copyright © 2011-2022 走看看