callee该属性是一个指针,指向拥有这个argument对象的函数
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * factorial(num-1)
}
}
// 定义函数一般都要用到递归算法,如上面的代码所示,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题
// 但问题是这个函数的执行与函数名factorial紧紧耦合在了一起,为了消除这种紧密的耦合现象,可以像下面这样使用arguments.callee
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
caller这个属性中保存着调用当前函数的函数引用,如果是在全局作用域中调用当前函数,它的值为null
function outer(){
inner();
}
function inner(){
alert(inner.caller);
}
outer();
// 以上代码会导致警告框中显示outer函数的源代码,因为outer()调用了inner(),所以inner.caller就指向outer(),为了实现更松散的耦合,也可以通过arguments.callee.caller来访问相同的信息
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller);
}
outer();