JavaScript関数内部属性アーグメンント
1326 ワード
JavaScript高級プログラム設計(第三版)、個人の読書ノート.
JS関数の内部には二つの特殊な対象があります.
argmentsは、入力関数のすべてのパラメータを含むクラスの配列オブジェクトです.この他にもう一つのcaleeの属性があります.この属性はポインタで、このargmentsオブジェクトを持つ関数を指します.
階乗の例を挙げると、ファイル名はfactoral.jsです.
次の二つのコードの実行結果を見てください.
JS関数の内部には二つの特殊な対象があります.
argmentsは、入力関数のすべてのパラメータを含むクラスの配列オブジェクトです.この他にもう一つのcaleeの属性があります.この属性はポインタで、このargmentsオブジェクトを持つ関数を指します.
階乗の例を挙げると、ファイル名はfactoral.jsです.
function factorial(num) {
if(num <= 1) {
return 1;
}else{
return num * factorial(num - 1);
}
}
// :
function factorial(num) {
if(num <= 1) {
return 1;
}else{
return num * arguments.callee(num-1);
}
}
このような書き方は主に関数の結合、書き換えのための関数であり、参照関数の時にどんな名前を使っても、正常に再帰的に呼び出されることが保証されます.次の二つのコードの実行結果を見てください.
//
function factorial(num) {
if(num <= 1) {
return 1;
}else{
return num * factorial(num - 1);
}
}
var trueFactorial = factorial;
factorial = function() {
return 0;
}
console.log(trueFactorial(5));
console.log(factorial(5));
//
//0
//0
変数true Factorialはfactorial値を取得しました.実際には別の位置に関数のポインタを保存しています.そして、簡単に0に戻る関数をfactoral変数にコピーします.だから、true Factorial実行時に内部のfactorialはもう書き換えられました.だから、0の結果を出力します.//
function factorial(num) {
if(num <= 1) {
return 1;
}else{
return num * arguments.callee(num-1);
}
}
var trueFactorial = factorial;
factorial = function() {
return 0;
}
console.log(trueFactorial(5));
console.log(factorial(5));
// :
//120
//0
関数は自分自身を呼び出すだけで、後の変数コピーの関数はfactoralの呼び出しを上書きしません.