因为这两个属性名称太相似了,所以容易混淆。
callee是arguments的属性,该属性是一个指针,指向拥有arguments对象的函数;而caller是函数对象的属性,这个属性中保存着调用当前函数的函数的引用,如果在全局作用域中调用当前函数,它的值是null。
callee常用于递归函数中,如:
function factorial(num){
if(num<=1){
return 1;
}else {
return num*factorail(num-1);
}
}
var f = factorial;
factorial = function(){
return 0;
}
console.log(f(5)); //0
调用f(5)时,在内部调用factorail时,因为factorail已经重新只能指向了另一个函数(一个返回0的函数),所有在内部调用的factorail返回的其实是0。
function factorial(num){
if(num<=1){
return 1;
}else {
return num*arguments.callee(num-1);
}
}
var f = factorial;
factorial = function(){
return 0;
}
console.log(f(5)); //120
因为内部调用的是arguments.callee,此时拥有arguments的函数是f函数,所以实现了递归。
function outer(){
inner();
}
function inner(){
console.log(inner.caller);
}
caller保存的是调用当前函数(inner)的函数(outer)的引用,所以结果为outer函数的源代码。
也可以通过arguments.callee.caller实现相同功能。
function outer(){
inner();
}
function inner(){
console.log(arguments.callee.caller);
}