0

標準の定義を満たすために別の関数の引数を再配置する関数があります。

function main(a, b, c) {
    console.log(a, b, c);                                  // 1 undefined undefined
    console.log(arguments[0], arguments[1], arguments[2]); // 1 undefined undefined

    shiftArgs(arguments, 3); // 3 because I'm expecting 3 arguments.

    console.log(arguments[0], arguments[1], arguments[2]); // null null 1
    console.log(a, b, c);                                  // 1 undefined undefined ***
}



function shiftArgs(args, c) {var i, len; 
   len = args.length; 
   if (len < c) { 
      for (i = c - 1; i >= 0; i -= 1) {
          args[i] = ((i - c + len) >  -1 ? args[i - c + len] : null);
      }
      args.length = c;
   }
};

main(1); // only calling main with one argument, which therefore needs to be the last one.

*** は問題の行であり、再割り当てされた引数オブジェクトと一致するように「null null 1」にする必要があります。

引数オブジェクトは必要に応じて変更され、メインによって呼び出される値「1」が最後の引数に移動されます。ただし、引数オブジェクトを移動しても、引数にマップされる変数名は変更されません (*** でマークされた最後の console.log を参照)。これは、変更された引数オブジェクトと一致するように null null 1 である必要があります)。

引数オブジェクトと一致するように、変数 a、b、および c を shiftArgs 関数によって再割り当てするにはどうすればよいですか?

4

2 に答える 2

2

そのような引数オブジェクトを台無しにしたくありません。パラメーター変数がマップされていることはバグがあると見なされ、厳密モードでも機能しません。

そのようなものには関数デコレータを使用することをお勧めします:

function shiftArgs(fn, c) {
    return function() {
        var lastIdx = arguments.length; 
        if (arguments.length < c)
            for (var i = c-1; i >= 0; i--)
                arguments[i] = ((i - c + lastIdx) >  -1 ? arguments[i - c + lastIdx] : null);
        arguments.length = c;
        return fn.apply(this, arguments);
    };
}

var main = shiftArgs(function(a, b, c) {
    console.log(a, b, c); // null null 1
}, 3);
于 2015-02-19T23:35:02.367 に答える
0

以下よりも一般的なものを探していますか?

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

? 私はそれが不可能だと比較的確信しています。

于 2015-02-19T23:25:25.947 に答える