setTimeout与setInterval在不同浏览器下的差异
setTimeout与setInterval是window对象的两个非常神奇方法,用于实现定时或延时调用一个函数或一段代码。
(新手可能认为setTimeout与setInterval是javascript函数,这是错误的。新手容易将javascript对象函数与DOM对象方法混淆。)
先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?
function f(){ var s = 'arguments.length:'+arguments.length+'; '; for(var i=0,n=arguments.length;i< n;i++){ s += ' ['+i+']:'+arguments[i]+'; '; } alert(s);}setTimeout(f,500,"javascript","AAA")iTimerID = setTimeout(strJsCode, 50) //strJsCode为一个包含 js代码的字符串 iTimerID = setTimeout(objFunction, 50) //objFunction为一个函数对象
setTimeout('alert(1)', 50); setTimeout('msgbox "终止、重试、忽略,您看着办吧。", vbAbortRetryIgnore + vbDefaultButton2, "告诉您"', 50, 'VBScript');
Mozilla上关于setTimeout的说明:
https://developer.mozilla.org/en/DOM/window.setTimeout
(三)其它浏览器系列(Opera, Safari, Chrome)中的setTimeout
和Mozilla系列中的基本一样,但是没有Mozilla系列中的多一个参数的BUG.
武林外传:使用setTimeout的小技巧
(1)IE中给setTimeout中的调用函数传参数
上面的分析可知,IE是不支持在setTimeout中给被调用的函数传参数的,为了浏览器世界的和谐,我们可以把函数调用参数包裹进新的匿名函数中。示例:
function f(a){
alert(a);
}
// setTimeout(f,50,'hello'); //用于非IE
setTimeout(function(){f('hello')},50); //通用
var str='hello';
setTimeout(function(){f(str)},50); //通用
(2)this问题
setTimeout调用的函数被执行时的上下文是全局,而不再是调用setTimeout方法时的上下文。所以,setTimeout的第一个参数的函数被执行时其this是指向window的,如果需要保留调用setTimeout方法时的this,就需要把当时的this传进去。示例:
function Person(name){
this.name=name;
var f=function(){alert('My name is '+this.name)};
// setTimeout(f,50); //错误
var THIS=this;
setTimeout(function(){f.apply(THIS)},50); //正确,通用
setTimeout(function(){f.call(THIS)},50); //正确,通用
}
new Person('Jack');
要说的就这些了。
发帖子不是脑力活,其实是体力活,组织文字,写例子,排版,这些没技术含量的事情是最累人最耗时间的。
-----
这是我的一篇老文章了,写在博客里的,觉得可以拿到这里来和大家分享一下。
如果排版乱,可以到我的博客里看,那里的格式好控制些。
这里的发帖内容不仅不能预览,还不能修改。
[解决办法]
Mark 学习
[解决办法]
路过,不只是setTimeOut,很多类似的方法引用都涉及到参数传递问题!
使用匿名函数封装一下还是不错的。
[解决办法]
//修复bug1,使用window.setTimeout调用if(!+'\v1') { (function(f){ window.setTimeout =f(window.setTimeout); window.setInterval =f(window.setInterval); })(function(f){ return function(c,t){ var a=[].slice.call(arguments,2); return f(function(){ c.apply(this,a)},t) } });}
[解决办法]
不错,
问世间游览器有多牛,让前端开发者撞破头!
[解决办法]
咳咳,世界跟着钱来走……
[解决办法]
不错,帮顶
[解决办法]
浏览器版本太多了,程序员杯具了
[解决办法]
我觉得这个差异相对来说不是很重要,因为一般情况下没人会给setTimeout传入两个
以上的参数。相对来说搞清楚setTimeout在什么时候运行比了解这些细节末节要有用
的多