首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

setTimeout与setInterval在不同浏览器上的差异研究

2012-10-31 
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

热点排行