在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()
来获取前两个之后的每个参数。
答案 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的所有参数,但前两个。但是,前两个是明确命名的,并且被引用(vCallback
和nDelay
)。