• Javascript arguments.callee和caller的区别


    一、callee

      在学习callee之前,需要先学习arguments。

      arguments:

    • 含义:该对象代表正在执行的函数和调用它的函数的参数。
    • 语法:
    1
    [function.]arguments[n]

      参数:function :当前正在执行的 Function 对象的名字。

           n :要传递给 Function 对象的从0开始的参数值索引。   

    • 说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
    • Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:

      1. callee:指向当前函数的引用
      2. length: 真正传递的参数的个数
      3. properties-indexes:就是函数的参数值(按参数列表从左到右排列)

      而其中第一个就是今天需要学习的一个属性。先看一个例子:

    1
    2
    3
    4
    5
    function add(a,b){
        console.log(arguments.callee);
        return a+b;
    }
    add(3,4);

      结果:

      

      从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。那么可以用这个属性可以做什么?再看一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function fac(num){
        if(num <= 1){ //0的阶乘也是1
            return 1;
        }
        else{
            return num*fac(num-1);
        }
    }
    var trueFac = fac;
    fac = function(num){
        return 0;
    };
     
    console.log(trueFac(10));

      结果:

      结果并不是我们想要的,造成这个结果的原因就是在后边更改了fac,fac()永远返回0,而trueFac()方法中利用了fac()方法,造成了结果是0。解决这个问题就可以使用arguments.callee属性。

      代码改为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function fac(num){
        if(num <= 1){ //0的阶乘也是1
            return 1;
        }
        else{
            return num*arguments.callee(num-1);
        }
    }
    var trueFac = fac;
    fac = function(num){
        return 0;
    };
     
    console.log(trueFac(10));

      结果为:

      arguments.callee指向arguments对象的拥有函数引用,当把fac的函数引用赋给trueFac后,arguments对象的拥有函数变成了trueFac,所以结果是正确的。

    二、caller

      caller与callee不同,caller属性并不属于arguments对象,它是函数对象的属性,Opera的早期版本不支持,这个属性保存着调用当前函数的函数的引用。

      例子:

    1
    2
    3
    4
    5
    6
    7
    function outer(){
        inner();
    }
    function inner(){
        console.log(inner.caller);
    }
    outer();

      结果:

     

      从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。

  • 相关阅读:
    MinIO:入门
    JS中面向对象的多种继承方式
    点击按钮实现图片下载
    给大家推荐一个免费的云平台-阿贝云
    REPLACE
    SUBSTRING_REGEXPR 截取字符串
    基本的git/linux/g++/ 等指令
    C++引用和指针&, *
    go语言异常处理 error panic recover defer
    django.db.utils.IntegrityError: (1048, "Column 'id' cannot be null")
  • 原文地址:https://www.cnblogs.com/ziyoublog/p/10723232.html
Copyright © 2020-2023  润新知