まず、JavaScript の関数の暗黙的なパラメーターについて説明します。 引数
Arguments
このオブジェクトは、実行される関数とそれを呼び出す関数のパラメーターを表します。
[function.]arguments[n]
パラメータ関数: オプション。現在実行中の Function オブジェクトの名前。 n: オプション。 Function オブジェクトに渡される引数値の 0 から始まるインデックス。
説明
Arguments は、関数呼び出し時に指定されたパラメータに加えて作成される隠しオブジェクトです。 Arguments は配列に似ていますが、配列ではないオブジェクトです。配列と同じアクセス プロパティとメソッドを持ち、対応する単一パラメーターの値に argument[ を通じてアクセスできるためです。 n] であり、配列長属性 length を持ちます。また、引数オブジェクトには、関数宣言で定義したパラメータリストに限らず、実際に関数に渡されるパラメータが格納されており、明示的に作成することはできません。引数オブジェクトは関数の先頭でのみ使用できます。次の例では、これらのプロパティの詳細を示します。
//引数オブジェクトの使用法。
function ArgTest(a, b){
var i, s = "ArgTest 関数が期待されています ";
var numargs = argument.length; // 渡されたパラメータの値を取得します。
var expargs = ArgTest.length; // 期待されるパラメータの値を取得します。
if (expargs < 2)
s = expargs " 引数。 ";
else
s = expargs " 引数。 ";
if (numargs < 2)
s = numargs " が渡されました。";
else
s = numargs " が渡されました。";
s = "nn"
for (i =0 ; i s = " Arg " i " = " argument[i] "n";
}
return(s); // 引数リストを返します。
}
引数が配列 (Array クラス) ではないことを説明するコードをここに追加しました:
Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);
function testAguments(){
alert (arguments.selfvalue);
}
コードを実行すると、最初のアラートに 1 が表示されることがわかります。これは、配列オブジェクトに値を持つ selfvalue 属性があることを意味します。 1 であり、関数 testAguments を呼び出すと、「未定義」が表示されます。これは、それが引数のプロパティではないこと、つまり、引数が配列オブジェクトではないことを示しています。
caller
現在の関数を呼び出した関数への参照を返します。
functionName.caller
functionName オブジェクトは、実行される関数の名前です。
説明
関数の場合、caller 属性は関数の実行時にのみ定義されます。関数がトップレベルから呼び出される場合、caller には null が含まれます。 caller 属性が文字列コンテキストで使用される場合、結果は functionName.toString と同じになります。つまり、関数の逆コンパイルされたテキストが表示されます。
次の例は、caller 属性の使用法を示しています。
// 呼び出し側デモ {
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString(); ;
} else {
alert("これはトップ関数です");
}
}
function handleCaller() {
callerDemo()
callee
指定された Function オブジェクトの本体である、実行中の Function オブジェクトを返します。
[function.]arguments.callee
オプションの function パラメーターは、現在実行されている Function オブジェクトの名前です。
説明
callee属性の初期値は実行中のFunctionオブジェクトです。
callee 属性は、引数オブジェクト自体への参照を表します。これは、匿名
関数の再帰や関数のカプセル化を保証するのに役立ちます。この例では、1 から n までの自然数を再帰的に計算します。そして、この属性
は、関連する関数が実行されている場合にのみ使用できます。また、呼び出し先には長さ属性があり、検証のために
が使用されることもあることにも注意してください。 argument.length は実際のパラメータの長さ、arguments.callee.length は
仮パラメータの長さから、呼び出し時の仮パラメータの長さが実際のパラメータの長さと一致しているかどうかを判断できます。
例