На странице MDN для 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
, но я не вижу ссылки на это имя где-либо перед этой строкой. Его также нет в списке Зарезервированные слова, поэтому он ни в коей мере не похоже на магию. Чтобы я мог понять это, он должен каким-то образом ссылаться на аргументы переопределенной функции setTimeout, а затем использовать slice()
для получения каждого аргумента после первых двух.