JSにおけるargmentsオブジェクトの詳細


作者:Windsctep出所:http://www.cnblogs.com/lwbqqyumidi/archive/2012/12/03/2799833.html
1、JavaScriptでは、argmentsオブジェクトは特別なオブジェクトで、実際には現在の関数の内蔵属性です。argmentsはArayと非常に似ていますが、実際にはArayの例ではありません。下記のコードで確認することができます(もちろん、実際には関数funcArgでは、argmentsを呼び出してfuncArg.argmentsと書く必要がないので、直接にargmentsを書けばいいです)。
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、argmentsオブジェクトの長さは、形の数ではなく実の数によって決められます。モダリティは関数内部でメモリ空間の保存を再開発する変数ですが、アーグメンツオブジェクトのメモリ空間とは重複していません。argmentsと値の両方が存在する場合、両者の値は同期されるが、一方の無値の場合、この無値の場合には値は同期されない。下記のコードは検証できます。
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);
3、JavaScriptの関数による声明と呼び出しの特性から、JavaScriptの関数は重載できないことが分かります。
他の言語での重積載の根拠によれば、「関数の戻り値が異なるか、あるいは形参個数が異なる」という結論が得られます。
第一:Javascript関数の声明は、値の種類を返していないということです。
第二に、JavaScriptにおける形参の個数は厳密には関数内の変数操作を容易にするためだけに、実際にはargmentsオブジェクトに既に格納されています。
また、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;
}
4、argmentsオブジェクトの中に非常に有用な属性があります。argments.calleeは、このargmentsオブジェクトの現在の関数参照を返します。関数再帰的呼び出しを使用する場合は、関数名自体の代わりにアーグメンント.calleeを使用することを推奨します。
以下のとおりです
function count(a){
    if(a==1){
        return 1;
    } 
    return a + arguments.callee(--a);
}

var mm = count(10);
alert(mm);