JavaScript では、引数オブジェクトは実際には現在の関数の組み込みプロパティです。 argument は Array に非常に似ていますが、実際には Array インスタンスではありません。これは、次のコードで確認できます (もちろん、実際には関数 funcArg では、引数を呼び出すときに funcArg.arguments を記述する必要はなく、引数を直接記述するだけです)。
Array.prototype.testArg = "test"; function funcArg() { alert(funcArg.arguments.testArg); alert(funcArg.arguments[0]); } alert(new Array().testArg); // result: "test" funcArg(10); // result: "undefined" "10"
引数オブジェクトの長さは、仮パラメータの数ではなく実際のパラメータの数によって決まります。仮パラメータは、関数内のメモリ空間で再度開かれる変数ですが、引数オブジェクトのメモリ空間とは重なりません。引数と値の両方が存在する場合、2 つの値は同期されますが、どちらか一方に値がない場合、この値のないケースでは値は同期されません。以下のコードが確認できます。
function f(a, b, c){ alert(arguments.length); // result: "2" a = 100; alert(arguments[0]); // result: "100" arguments[0] = "qqyumidi"; alert(a); // result: "qqyumidi" alert(c); // result: "undefined" c = 2012; alert(arguments[2]); // result: "undefined" } f(1, 2);
JavaScript の関数の宣言と呼び出しの特性から、JavaScript の関数はオーバーロードできないことがわかります。
他の言語でのオーバーロードの基礎「関数の戻り値が異なるか、仮パラメータの数が異なる」に従って、上記の結論を導き出すことができます:
第一: Javascript 関数の宣言には、戻り値の型;
2 番目: 厳密に言えば、JavaScript の仮パラメータの数は関数内の変数操作を容易にするためのものです。実際には、実際のパラメータはすでに引数オブジェクトに格納されています。
さらに、JavaScript の関数を JavaScript 関数自体からオーバーロードできない理由を深く理解しましょう。JavaScript では、関数は実際にはオブジェクトであり、関数名は関数への参照であるか、関数名自体が変数です。以下に示す関数宣言と関数式の実際の意味は (関数宣言と関数式の違いを考慮せずに) 上記と同じです。これは、JavaScript の関数がオーバーロードできないという特徴を理解するのに非常に役立ちます。
function f(a){ return a + 10; } function f(a){ return a - 10; } // 在不考虑函数声明与函数表达式区别的前提下,其等价于如下 var f = function(a){ return a + 10; } var f = function(a){ return a - 10; }
引数オブジェクトには、callee という非常に便利な属性があります。 argument.callee は、この引数オブジェクトが存在する現在の関数参照を返します。再帰的な関数呼び出しを使用する場合は、関数名自体の代わりに argument.callee を使用することをお勧めします。
は次のとおりです:
function count(a){ if(a==1){ return 1; } return a + arguments.callee(--a); } var mm = count(10); alert(mm);