前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >callee和caller的区别_caller中文

callee和caller的区别_caller中文

作者头像
全栈程序员站长
发布2022-11-15 17:36:36
6900
发布2022-11-15 17:36:36
举报
文章被收录于专栏:全栈程序员必看

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档