递归函数是一个函数通过名字调用自身的情况下构成的,例如:
function factorial(num){
if(num<1){
return 1;
}else{
return num*factorial(num1);
}
}
这是一个经典的递归阶乘函数,虽然表面上看没有什么问题,但下面的代码可能导致它出错。
var anothorFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));//报错
以上代码先把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设置为null,结果指向原始函数的引用只剩下一个。但是接下来调用anotherFactorial()时,由于必须执行factorial()函数,而此时factorial已经不再是函数,所以就会导致错误。在这种情况下,使用arguements.callee就可以解决这个问题。(arguments.callee是一个指向正在执行的函数的指针,因此可以用来实现递归调用)
function factorial(num){
if(num<1){
return 1;
}else{
return num*arguments.callee(num1);
}
}
再看另一种耦合情况:
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();