2

関数に渡されたパラメーターを確認し、指定されていないものや「気に入らない」ものを置き換えたい。そのために、私は次のことを行いました(使用したい理由argumentsは、それを行う汎用関数が必要なためです)(node.jsでも同じ結果で、Loggerをコンソールに変更するだけです):

function argtest (x,y,z) {
  Logger.log ("at begin x="+x+", y="+y+", z="+z);
  arguments.length=3; // found this somewhere, doesn't help
  arguments[0]="a";
  arguments[1]="b";
  arguments[2]="c";
  Logger.log ("arguments now:");
  for (var i in arguments) {
    Logger.log ("arguments["+i+"]="+arguments[i]);
  }
  Logger.log ("at end x="+x+", y="+y+", z="+z);
}
function callArgTest () {
  argtest ();
  argtest (1,2,3);
}

したがって、呼び出しの結果はcallArgTest次のようになります。

Logger.log([at begin x=undefined, y=undefined, z=undefined, []])
Logger.log([arguments now:, []])
Logger.log([arguments[0]=a, []])
Logger.log([arguments[1]=b, []])
Logger.log([arguments[2]=c, []])
Logger.log([at end x=undefined, y=undefined, z=undefined, []])
Logger.log([at begin x=1, y=2, z=3, []])
Logger.log([arguments now:, []])
Logger.log([arguments[0]=a, []])
Logger.log([arguments[1]=b, []])
Logger.log([arguments[2]=c, []])
Logger.log([at end x=a, y=b, z=c, []])

したがって、パラメーター x、y、z は、最初に指定されたときにのみ変更されます。最初のケース (パラメーターなしで呼び出すargtest) では、引数に値を割り当てた後でも未定義のままです。では、それを機能させるために何が欠けているのでしょうか? x、y、zに触れたくないことに注意してください。代わりに、最終的な実装では、引数をそれらで動作する関数に渡したいと思います。

4

3 に答える 3

1

問題は、 を呼び出すときにargtest()arguments実際にはやforなど"0"を参照するプロパティがないことです。x"1"y

argtest()      => arguments = { "length": 0 }
argtest(1,2,3) => arguments = { "length": 3, "0": x, "1": y, "2": z }

その参照の定義はES5 10.611.cのステップで説明されており、 の各「インデックス」に対してゲッターとセッターを定義していますが、指定された引数の数と渡された引数の数の両方によって制限されます。arguments

あなたの意図について:

関数の先頭にある既存の実装に、単に引数といくつかのデフォルトをパラメーターとして受け取る関数の呼び出しを挿入したいと考えています。defaults (arguments, "string=nana", "number=4")

おそらく、次のようなものが簡単に見つかります。

function argTest(x, y, z) {
    x = typeof x !== 'undefined' ? x : ...;
    y = typeof y !== 'undefined' ? y : ...;
    // etc.
}

あなたがしたいことはES5で可能ですが、Object.create/Object.definePropertiesまたはget/を介して値が渡されたかどうかにかかわらず、各「インデックス」および名前付き引数のゲッターとセッターを使用して独自の「引数」オブジェクトを定義することを意味しますset-そして、私はこれを「単純に」考えないでください:

function argtest(x, y, z) {
    defaults({
        length: argtest.length,

        get '0'() { return x; },
        set '0'(val) { x = val; },

        get '1'() { return y; },
        set '1'(val) { y = val; },

        get '2'() { return z; },
        set '2'(val) { z = val; }
    }, ...);

    // ...
}
于 2013-01-02T23:30:54.200 に答える
0

おそらく、次のようなことができます。

var args = Array.prototype.slice.call(arguments);

そして、args? args必要に応じて、他の関数に渡すことができます。これが役に立ったかどうか、または間違ったツリーを吠えているかどうかをお知らせください。

于 2013-01-02T23:21:39.073 に答える
0

arguments[0]="a";
arguments[1]="b";
arguments[2]="c";

なぜ追加しないのですか

x = arguments[0];
y = arguments[1];
z = arguments[2];

? これがあなたの目標を達成しない理由があると思いますが、実際にあなたの目標を達成するものを確認するには、より現実的な例が必要だと思います.

于 2013-01-02T20:45:07.843 に答える