概述
callee
callee是对象的一个属性,它一个指针,指向参数arguments对象的函数,用过
argument.callee
的方式来指向该函数;
看下面这段递归函数:
function factorial(num){
if (num <= 1)
return 1;
else
return num * factorial(num - 1);
}
let subFactorial = factorial;
factorial = null;
console.log(subFactorial(3));//报错
上面的代码会报下面的错误:
- 我们把
factorial()
函数保存到一个subFactorial
变量中,然后把-factorial
设为null
,只保留一个引用;- 但是在调用
subFactorial()
的时候会报错,为什么呢?我们不是已经把factorial()
函数存到subFactorial
中了吗?- 如果我们仔细看代码的话就会发现一个问题,在调用递归的时候我们还是需要调用
factorial()
函数才能实现,但是在我们将factorial
设为null
的情况下是访问不到的,所以这样非常的不方便;
于是我们采用callee的方式来解决这个问题:
function factorial(num){
if (num <= 1)
return 1;
else
return num * arguments.callee(num - 1)
}
let subFactorial = factorial;
factorial = null;
console.log(subFactorial(3));//6
将递归要调用的函数
factorial()
改为arguments.callee()
,由于arguments.callee
指向的就是正在执行的函数的指针,在函数内部直接调用,它指向的就是该函数本身,所以就算把factorial
设为null
也不会影响到递归的调用;
caller
caller是ECMAScript5提出给函数对象上添加一个属性,这个属性引用的是调用当前函数的函数,或者如果是全局作用域中调用的则为null;
废话少说,上代码:
function a(){
b();
}
function b(){
console.log(b.caller);
}
a();
打印的结果是a()函数的源代码:
很明显,这里已经可以看出来了,上面的代码调用了
a()
函数,a()
中又执行了b()
,最后b()
函数打印出b.caller
,这里的b.caller
就是当前调用了b()
函数的a()
函数,所以打印出来的就是a()
函数的源代码。
我们还可以用arguments.callee.caller
的方式来降低他们之间的耦合度,比如:
function a(){
b();
}
function b(){
console.log(arguments.callee.caller);
}
a();
最后
以上就是懦弱向日葵为你收集整理的JavaScript中的callee和caller的用法的全部内容,希望文章能够帮你解决JavaScript中的callee和caller的用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复