MDN上的代码:这个IE特定的shim for setTimer是如何工作的?

时间:2013-01-24 09:43:27

标签: javascript

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列表中,所以它似乎不是 magic 。为了让我能够理解它,它必须以某种方式引用重写的setTimeout函数的参数,然后使用slice()来获取前两个之后的每个参数。

3 个答案:

答案 0 :(得分:1)

arguments确实很神奇;它是一个非常类似于包含传递给当前函数的参数的数组的对象。该对象在所有函数中都有本地范围。

由于它不是完全数组,因此模式Array.prototype.slice.call(arguments)通常用于将多个(或所有)参数值提取到实数数组中。在这种特定情况下,aArgs最终成为一个数组,其中包含除了前两个之外传递给setTimeout替换的所有参数。

答案 1 :(得分:1)

arguments 魔术 - 它是以数组形式传递给函数的参数。

请参阅MDN上的arguments“与传递给所有函数中可用函数的参数对应的类似数组的对象”

答案 2 :(得分:1)

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

请记住,假设以下功能

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

进行此类通话也是有效的

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

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


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

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

复制传递给shim-function的所有参数,但前两个。但是,前两个是明确命名的,并且被引用(vCallbacknDelay)。