Параметры IE получают undefined при их использовании в setTimeout

Возможный дубликат:
setTimeout Internet Explorer

Я что-то упустил или есть проблема в Internet Explorer при передаче параметров функции в setTimeout, вызывающий ту же функцию?

Это будет работать вечно в Internet Explorer:

function myFunction(myParam, tries){
  if (typeof tries == "undefined"){
    tries = 0;
  }
  tries++;
  if (tries < 2){
    setTimeout(myFunction, 50, myParam, tries);
  }
}
myFunction("something");

Есть ли способ обойти эту проблему?

http://fiddle.jshell.net/rH3gx/

Ответ 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;
}

Ответ 2

http://fiddle.jshell.net/rH3gx/2/

Вам нужно обернуть функцию в функцию, которая не требует аргументов:

function myFunction(myParam, tries){
  if (typeof tries == "undefined"){
    tries = 0;
  }
  tries++;
  if (tries < 2){
    setTimeout(function() {
         myFunction(myParam, tries);
    }, 50);

  }
}

myFunction("something");