0

setTimerのMDNのページには、setTimerの小さなシム/互換性レイヤーがあり、InternetExplorerがコールバックに渡されるsetTimerメソッドの追加の引数を受け入れることができます。

私は以下のすべてのコードをほぼ理解しています:

if (document.all && !window.setTimeout.isPolyfill) {
  var __nativeST__ = window.setTimeout;
  window.setTimeout = function (
                          vCallback, 
                          nDelay /*, 
                          argumentToPass1, 
                          argumentToPass2, etc. */
                          ) {
    var aArgs = Array.prototype.slice.call(arguments, 2);
    return __nativeST__(vCallback instanceof Function ? function () {
      vCallback.apply(null, aArgs);
    } : vCallback, nDelay);
  };
  window.setTimeout.isPolyfill = true;
}

1行を除く:

var aArgs = Array.prototype.slice.call(arguments, 2);

を参照argumentsしていますが、この行の前のどこかでその名前が参照されているのがわかりません。予約語リストにも載っていないので、魔法のようには思えません。私がそれを理解するためには、オーバーライドされたsetTimeout関数の引数を何らかの形で参照しslice()、最初の2つ以降のすべての引数を取得するために使用する必要があります。

4

3 に答える 3

1

arguments確かに魔法です。これは、現在の関数に渡される引数を含む配列に非常によく似たオブジェクトです。このオブジェクトは、すべての関数内にローカル スコープを持ちます。

これは厳密には配列ではないため、このパターンArray.prototype.slice.call(arguments)は通常、いくつかの (またはすべての) 引数値を実数配列に抽出するために使用されます。この特定のケースでは、最初の 2 つを除いて、置換aArgsに渡されたすべての引数を含む配列になります。setTimeout

于 2013-01-24T09:45:26.697 に答える
1

arguments マジックです- 関数に渡された引数が配列形式になっています。

MDNの引数を参照してください: 「関数に渡される引数に対応する配列のようなオブジェクト [...] すべての関数内で使用可能」

于 2013-01-24T09:45:53.350 に答える
1

このオブジェクトargumentsは、関数宣言で指定されていないものを含め、関数に渡されたすべての引数を保持します。

次の関数を想定していることを覚えておいてください

function doStuf( param1 ) { /* do something */ }

このような呼び出しを行うことも有効です

doStuff( 'stuff', 'morestuff', 2, 'evenmorestuff' );

その場合、argumentsオブジェクトを使用してすべてのパラメーターを参照できます。


したがって、特定のコードでは、次の行

var aArgs = Array.prototype.slice.call(arguments, 2);

shim-function に渡されたすべての引数をコピーしますが、最初の 2 つをコピーします。ただし、最初の 2 つは明示的に名前が付けられており、そのように参照されます (vCallbackおよびnDelay)。

于 2013-01-24T09:49:14.040 に答える