大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
Javascript arguments.callee和caller的区别
一、callee
在学习callee之前,需要先学习arguments。
arguments:
- 含义:该对象代表正在执行的函数和调用它的函数的参数。
- 语法:
1 |
|
参数:function :当前正在执行的 Function 对象的名字。
n :要传递给 Function 对象的从0开始的参数值索引。
- 说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
-
Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:
- callee:指向当前函数的引用
- length: 真正传递的参数的个数
- properties-indexes:就是函数的参数值(按参数列表从左到右排列)
而其中第一个就是今天需要学习的一个属性。先看一个例子:
1 2 3 4 5 |
|
结果:
从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。那么可以用这个属性可以做什么?再看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
结果:
结果并不是我们想要的,造成这个结果的原因就是在后边更改了fac,fac()永远返回0,而trueFac()方法中利用了fac()方法,造成了结果是0。解决这个问题就可以使用arguments.callee属性。
代码改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
结果为:
arguments.callee指向arguments对象的拥有函数引用,当把fac的函数引用赋给trueFac后,arguments对象的拥有函数变成了trueFac,所以结果是正确的。
二、caller
caller与callee不同,caller属性并不属于arguments对象,它是函数对象的属性,Opera的早期版本不支持,这个属性保存着调用当前函数的函数的引用。
例子:
1 2 3 4 5 6 7 |
|
结果:
从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/227654.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...