在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函数的所有参数,但复制前两个参数。但是,前两个已被明确命名并以此名称引用(
vCallback
和nDelay
)。MDN documentation