2

私は物事をテストしていました。そして、引数を指定しないと引数を設定できないことがわかりました。arguments[1]などを使用する.

例:

function abc (a,b) {
arguments[1] = 'new value';
console.log(b);
}
abc('a');

うまくいきません。

値を次のように設定できることは知っていますif (b=='undefined') b='default';が、なぜこれが気に入らないのですか。つまり、この動作は想定外ですよね。

一方、引数を指定すると、変更されます!

このように関数を呼び出すと、新しい値が出力されます

abc('a','b');

arguments[2]関数を呼び出すときに使用して値を設定し、引数を渡したい場合、解決策はありますか。

さらにテストした結果、呼び出されない場合はb接続されないようです。arguments[1]

4

4 に答える 4

1

私の理解では、引数は動的であり、その長さは関数に提供される引数/パラメーターの数によって設定されます。

最初のケースでは、1 つのパラメーターのみを指定したため、引数のサイズは 1 であるため、引数 [1] は範囲外である必要がありますが、2 番目のケースでは、長さ 2 の引数があるため、インデックスを使用していずれかのパラメーター値を変更できます。 .

于 2013-07-04T21:19:39.670 に答える
1

ひどく間違った回答を投稿した後、ECMA Specargumentsを調べたところ、オブジェクトが作成されるときに JavaScript が行うコードは次のとおりです。

function abc () {
    var names = ["a", "b"];  //as normally provided in the function declaration: function (a, b)
    var a, b;
    var args = {};
    var mappedNames = [];
    args.length = arguments.length;
    var index = args.length - 1;

    //this is the crucial part. This loop adds properties to the arguments object
    //and creates getter and setter functions to bind the arguments properties to the local variables
    //BUT: the loop only runs for the arguments that are actually passed.
    while (index >= 0) {
        var val = arguments[index];
        if (index < names.length) {
            var name = names[index];
            if (mappedNames.indexOf(name) === -1) {
                mappedNames.push(name);
                var g = MakeArgGetter(name);
                var p = MakeArgSetter(name);
                Object.defineProperty(args, index.toString(), {get : g, set : p, configurable : true});
            }
        } 
        args[index.toString()] = val;
        index--;
    }

    function MakeArgGetter(name) {
        return function zz(){
            return eval(name);
        };
    }

    function MakeArgSetter(name) {
        return function tt(value) {
            eval(name + " = value;");
        };
    }

    console.log(args[0]);   //ab
    args[0] = "hello";  
    args[1] = "hello";
    console.log(a);         //hello      
    console.log(b);         //undefined

}
abc('ab');

仕様にはさらにいくつかのことが行われていることに注意してください。私はそれをあちこちで単純化しましたが、これは本質的に起こっていることです.

于 2013-07-04T21:22:04.240 に答える
0

これによって何を達成しようとしていますか?

abc('a)とのような「動的引数」abc('a', 'b')が必要であるが、最初の引数が不足している引数をデフォルト値に設定する場合は、引数の長さおよび/またはすべての引数の値を確認する必要があります。

次のように仮定しますabc('a', null)。- ロジックに依存し、良いことも悪いこともあります。

これを考えると、引数ベクトルのチェックはスマートではありませんが、より不可解であり、if (b=='undefined') b='default'より直接的で理解しやすいものになっています。

于 2013-07-04T21:24:07.533 に答える