为什么Firefox setInterval回调参数与其他浏览器不同?

时间:2011-02-12 17:56:53

标签: javascript firefox setinterval

我在Win 7的每个浏览器中都测试了这个脚本。它不仅适用于Firefox(版本3.6.13)。

除了返回随机数的Firefox之外,警报框在所有浏览器中都返回“undefined”。这是脚本

function nextSlide(nav){
    alert(nav);
}

jQuery(function(){
    var set = setInterval(nextSlide, 2000); 
});

这是live demo

2 个答案:

答案 0 :(得分:5)

额外参数是回调延迟的毫秒数。来自documentation

  

回调参数

     

setInterval()会将回调函数调用后的毫秒数传递给回调函数,如果它希望将其他内容作为参数,则可能会混淆它。要回避这个问题,请使用匿名函数来调用您的回调。

修复就是写这个:

var set = setInterval(function() { nextSlide(); }, 2000);

答案 1 :(得分:1)

Mark Byers在使用Mozilla文档解释时是正确的。

但是,这是Firefox扩展程序WindowTimers interface - 至少与HTML5 工作草案中的一样 - 实际上有不同的要求。当然,因为这是一个不稳定的领域......

  
    

handle = window。 setInterval(handler [,timeout [,arguments]])

         

计划超时以在每个超时毫秒运行处理程序。 任何参数都会直接传递给处理程序

  

因此,可以看到Firefox违反了这一点,因为arguments.length即使“没有参数”通过也是{。

我相信HTML4它只是在没有任何“官方标准”定义的情况下实现 - 或者至少没有我所知道的 - 并且,在这种情况下,Firefox可以做任何它喜欢的事情。我很乐意进行更正/参考。

修改

Firefox 确实支持参数传递,正如Neil所指出的那样,arguments.length总是比传递给“偏移”数据的参数数量多一个 - 没有魔法正在arguments.length完成(这本身就是非常可怕的)。

重要的是要记住:在计时器回调或面对浏览器差异时使用arguments.length时不要使用和/或小心。 (这与其他事件回调一致)。