JavaScript関数内部属性アーグメンント

1326 ワード

JavaScript高級プログラム設計(第三版)、個人の読書ノート.
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の呼び出しを上書きしません.