callee和caller的区别_caller中文

callee和caller的区别_caller中文Javascriptarguments.callee和caller的区别一、callee  在学习callee之前,需要先学习arguments。  arguments:含义:该对象代表正在执行的函数和调用它的函数的参数。 语法: 1 [function.]arguments[n]   参数:function:当前正在执行的Func…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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和caller的区别_caller中文

  从结果可以看到,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));

  结果:

callee和caller的区别_caller中文

  结果并不是我们想要的,造成这个结果的原因就是在后边更改了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));

  结果为:

callee和caller的区别_caller中文

  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();

  结果:

 callee和caller的区别_caller中文

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/227654.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • oracle dba书籍推荐_推荐给大学生必读的书

    oracle dba书籍推荐_推荐给大学生必读的书推荐给DBA的Oracle书籍

  • postGresql_oracle生成uuid函数

    postGresql_oracle生成uuid函数之前用sqlserver,获取uuid,获取直接selectnewid()就好了,但是postgresql没有这种函数,只好自己写个了。如下:CREATEORREPLACEFUNCTIONuuid() RETURNStextAS$$declarestr1text;str2text;Mactext;begin–MAC地址Mac=’aa:aa:a…

  • 公共开放WebService接口

    公共开放WebService接口公共开放WebService接口快递查询WEB服务 http://webservice.36wu.com/ExpressService.asmx支持上百家快递/物流查询,准确高效,所有数据均来自快递服务商。此数据返回类型进行了封装,方便开发人员和应用者进行调用,后期会提供返回json类型,敬请关注。支持的快递/物流天气预报WEB服务 ht

  • 海思android4.4 SDK编译Latin输入法[通俗易懂]

    海思android4.4 SDK编译Latin输入法

  • linux nslookup命令安装,在CentOS中安装nslookup命令

    linux nslookup命令安装,在CentOS中安装nslookup命令域名查询工具nslookup并不是Win系统的专利,Linux系统中也可以使用,不过要安装,默认没有。在CentOS中安装nslookup命令:$sudoyuminstallbind-utils这个bind-utils包,就包含了nslookup命令。Ubuntu系统应该也是一样的,还没有测试过。nslookup是一个能够查询互联网域名服务器信息的程序。他有两种工作模式,即“交互模式”和“…

    2022年10月19日
  • pad图和n-s图_N S W

    pad图和n-s图_N S W(未完成_N-S图、PAD图概念未写)1、记录StudentRecord给出即将大学毕业的学生的姓名和平均分(GPA)。我们的目的是建立一个参加毕业典礼的学生表。候选毕业的学生表从文件”StudRecs”读入。因为学校规定:GPA低于minGPA的学生不能毕业,因此那些平均分低于minGPA的学生不参加毕业典礼。另外,记录那些选择不参加毕业典礼的学生名单,将名单保存至文件”NoAttend”中,按每行一个学生姓名保存。删除这些选择不参加毕业典礼的学生,最终生成参加毕业典礼的学生表。2、画出下列程序流

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号