setTimeout与setInterval在不同浏览器下的差异研究setTimeout与setInterval是window对象的两个非常神奇方
setTimeout与setInterval在不同浏览器下的差异研究
setTimeout与setInterval是window对象的两个非常神奇方法,用于实现定时或延时调用一个函数或一段代码。
(新手可能认为setTimeout与setInterval是javascript函数,这是错误的。新手容易将javascript对象函数与DOM对象方法混淆。)
先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?
"Lateness" argument
Functions invoked by setTimeout are passed an extra "lateness" argument in Mozilla,
i.e., the lateness of the timeout in milliseconds. (See bug 10637 and bug 394769.)
这就是开头那个例子中,Firefox(3.0)下有一个乌龙数字的根源。
Mozilla上关于setTimeout的说明:
https://developer.mozilla.org/en/DOM/window.setTimeout
(三)其它浏览器系列(Opera, Safari, Chrome)中的setTimeout 和Mozilla系列中的基本一样,但是没有Mozilla系列中的多一个参数的BUG.
武林外传:使用setTimeout的小技巧 (1)IE中给setTimeout中的调用函数传参数 上面的分析可知,IE是不支持在setTimeout中给被调用的函数传参数的,为了浏览器世界的和谐,我们可以把函数调用参数包裹进新的匿名函数中。示例:
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');
要说的就这些了。
发帖子不是脑力活,而是体力活,组织文字,写例子,排版,这些没技术含量的事情是最累人最耗时间的。 1 楼 cuixiping 2010-01-24 javaeye的帖子显示不是用的等宽字体,所以在UBB模式下写的英文内容,出来之后就对不齐了,排版啊排版,累。 2 楼 soni 2010-01-25 我知道这2个函数是属于dom的。但还真不知道这么多差异。 3 楼 klovelovely 2010-06-25 setTimeout与setInterval还有一个区别,班门弄斧一下
就是setTimeout对于所传参数(无论是语句或是函数)执行完之后才会进行下一次时间间隔的计算。
而 setInterval则不会理会每次执行的参数是否完成,在一些对时间要求比较精确的环境下会更加有用,比如时间的计算。
拙见,多多指教!*^^* 4 楼 tizll521 2010-07-14 受益非浅 看完了 5 楼 对酒当歌,人生几何 2010-09-26 原来参数 是这么回事,顶楼主,比我留心。 6 楼 clue 2010-09-26 klovelovely 写道setTimeout与setInterval还有一个区别,班门弄斧一下
就是setTimeout对于所传参数(无论是语句或是函数)执行完之后才会进行下一次时间间隔的计算。
而 setInterval则不会理会每次执行的参数是否完成,在一些对时间要求比较精确的环境下会更加有用,比如时间的计算。
拙见,多多指教!*^^*
你的理解错了,浏览器中的JS执行进程是单线程的,上一个JS任务未执行完成,是不会开始下一个任务的。
参考:
JavaScript的单线程性质以及定时器的工作原理
http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html