Ответ 1
Объяснение и решение в MDN:
Если вам нужно передать аргумент функции обратного вызова, но это необходимо для работы в Internet Explorer, который не поддерживает отправку дополнительных параметров (ни с setTimeout(), ни с setInterval()), вы можете включить этот код совместимости с IE, который позволит Стандартные параметры прохождения HTML5 в этом браузере для оба таймера просто вставляют его в начале ваших скриптов.
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;
}
if (document.all && !window.setInterval.isPolyfill) {
var __nativeSI__ = window.setInterval;
window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
var aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeSI__(vCallback instanceof Function ? function () {
vCallback.apply(null, aArgs);
} : vCallback, nDelay);
};
window.setInterval.isPolyfill = true;
}