JavaScriptにおけるパラメータオブジェクトargmentsのcalee属性

1148 ワード

オブジェクトのargmentsは、主に関数パラメータを保存するために使用されていることはよく知られていますが、このオブジェクトは、argmentsオブジェクトを持つ関数を指すポインタであるcaleeという属性を持っています.その重要な用途は関数と関数名の結合の度合いを下げることである.例を挙げて説明しましょう.この非常に古典的な再帰関数を見てください.
例1:

function factorial(num){
    if(num<=1){
        return 1;
    }else{
       return num*factorial(num-1);
    }
}
    上記の例では、関数名が以後変わらない場合、このような定義は大丈夫です.問題はこの関数の実行が関数名factoralと密接に結合されていることです.まず関数名の変更例を見ます.
例2:

var trueFactorial = factorial;
factorial = function(){
    return 0;
};

alert(trueFactorial(5));//0
alert(factorial(5));//0
    これは私達の初心に背いて、私達はalert(true Factorial(5)を望みます.この文は120を返します.このような緊密な結合現象を解消するために、argments.caleeを次のように使用することができる.
例3:

function factorial(num){
    if(num<=1){
        return 1;
    }else{
       return num*arguments.callee(num-1);
    }
}
    修正後、再実行例2、alert(true Factorial(5));文の結果は120で、alert(factoral(5);ステートメントの結果は0です.すなわち、関数内のコードと関数名の結合状態に接触した後も、true Factorialは、階乗を正確に計算することができます.