Bootstrap

函数中的耦合问题

递归函数是一个函数通过名字调用自身的情况下构成的,例如:

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();
;