一、callee
在学习callee之前,需要先学习arguments。
arguments:
1 | [function.]arguments[n] |
---|
参数:function :当前正在执行的 Function 对象的名字。
n :要传递给 Function 对象的从0开始的参数值索引。
而其中第一个就是今天需要学习的一个属性。先看一个例子:
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()。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/227654.html原文链接:https://javaforall.cn