【问题标题】:IE parameters get undefined when using them in setTimeout [duplicate]在 setTimeout 中使用 IE 参数时未定义 [重复]
【发布时间】:2012-09-13 10:47:06
【问题描述】:

可能重复:
setTimeout Internet Explorer

在将函数参数传递给调用同一函数的setTimeout 时,我是否遗漏了某些内容或 Internet Explorer 中存在问题?

这将在 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/

【问题讨论】:

  • 这花了我一两个小时来弄清楚为什么我的外部范围变量是undefined。 Internet Explorer 是最糟糕的!

标签: javascript internet-explorer settimeout


【解决方案1】:

解释和解决方法是in the 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");

【讨论】:

  • 这对我来说效果最好
  • 如果在这 50 毫秒内更改了参数,则将不起作用
  • 在 IE 和 Chome 中为我工作。谢谢。
  • @denns 在这个例子中参数不能改变
【解决方案3】:
setTimeout(function(){myFunction(myParam, tries);}, 50);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多