MDN's page for setTimer上,setTimer有一个垫片/兼容性层,它将使Internet Explorer在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;
}


除了一行:

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


它引用了arguments,但我看不到该行之前任何地方都引用了该名称。它也不在Reserved words列表中,因此无论如何似乎都不是魔术。为了使我对它有所了解,它必须以某种方式引用覆盖的setTimeout函数的参数,然后使用slice()获取前两个参数之后的每个参数。

最佳答案

对象arguments包含传递给函数的所有参数,包括那些在函数声明中未命名的参数。

请记住,假设以下功能

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


打这样的电话也是有效的

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


在这种情况下,您可以使用arguments对象引用所有参数。



因此,在您的特定代码中,以下一行

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


复制传递给shim函数的所有参数,但复制前两个参数。但是,前两个已被明确命名并以此名称引用(vCallbacknDelay)。


MDN documentation

10-04 22:19