您的位置: 首页 > 技术文档 > 网页制作 > 解读javascript的计时器 I
关于浮动的前世今生 回到列表 使用jQuery改进文件上传控件
 解读javascript的计时器 I

作者:dishuipiaoxiang 时间: 2009-08-17 文档类型:翻译 来自:Denis'Blog

第 1 页 解读javascript的计时器 [1]
第 2 页 解读javascript的计时器 [2]
第 3 页 解读javascript的计时器 [3]

既然javascript在一定时间内之执行一部分代码(源于单线程的特性),那么这些代码块的每一个就被封锁在其它异步事件执行的进程中。这表明当一个异步事件发生时(如鼠标点击、计时器释放、XMLHttpRequest请求完成),它将排队等候执行(如何排队在不同浏览器之间是不一样的)。

首先,在第一代码块里,有两个计时器触发:一个是10ms的setTimeout,一个是10ms的setInterval。在第一个代码块真正完成之前,它实际上已经释放了。但是,注意,它不会立即执行(由于单线程的问题,它无能为力),相反,为了能在下一个可行的时间得到执行,那些延时函数被编入队列。

另外,在第一个代码块内,我们看到鼠标点击出现。与这个异步事件(我们永远不知道何时执行动作,这样就可以认为它是不同步的)相关Javascript回调函数跟初始的计时器一样不能立即被执行,它排队等候执行。

在Javascript最初的代码块执行完毕之后,浏览器会发出疑问:正在等候执行的是什么?在这种情况下,鼠标点击处理器和计时器回调函数同时处于等待之中,然后,浏览器将选择一个并立即执行它,计时器函数将等到下一个可能的时间执行。

注意,当鼠标点击函数处理器执行时,第一个回调函数也在执行,至于计时器,其处理器被编入队列稍后执行。但是,请注意,当Interval再次释放时(在计时器处理器执行时),计时器执行的时间将减少。如果你在一大块代码执行期间将所有的Interval回调函数编入队列,其结果是一大群Interval回调函数会毫无延迟的执行,直到全部完成。而浏览器在队列增大之前只是简单的等到没有Interval处理器排队为止(间歇问题)。

事实上,我们看到这样一个情况:Interval正在执行时,第三个Interval函数将释放。这表明一个重要的事实:Interval对当前正在执行什么漠不关心,它们将不会青红皂白的排队,即使是牺牲回调函数之间的时间也在所不辞。

最后,在第二个Interval函数执行完毕之后,我们可以看到没有留下任何Javascript引擎执行的东西。也就是说,浏览器在等待一个新的异步事件的出现。Interval再次释放时,我们在50ms处获得它,但这一次,执行起来没有任何障碍,它立即释放。

我们来看一个例子,以便更好的说明setTimeout和setInterval的差异:

setTimeout(function(){
/* Some long block of code... */
setTimeout(arguments.callee, 10);
}, 10);
setInterval(function(){
/* Some long block of code... */
}, 10);

乍一看,这两段代码似乎功能相同,但并非如此。setTimeout代码在前一个回调函数执行万之后,至少有10ms的延迟(最终可能多些,但至少不会少于此),而setInterval将每隔10ms尝试执行一次回调函数而不管最后一个回调函数何时执行。

这里有很多我们需要了解,让我们回顾一下:

  1. Javascript只有单线程,异步事件被迫排队等候执行;
  2. setTimeout和setInterval在如何执行异步代码方面有根本的区别;
  3. 如果计时器无法立即执行,它将延时到下一个可能的时间执行(这比预想的延迟时间要长一些);
  4. 如果有充分的执行时间,Interval可能会毫无延迟的来回执行。

所有这些无疑是重要的知识,了解Javascript引擎如何工作,特别是有大量异步事件出现时,这使得在构建高级应用代码片段时有一个良好的基础。

出处:Denis'Blog
责任编辑:bluehearts

上一页 解读javascript的计时器 [1] 下一页 解读javascript的计时器 [3]

◎进入论坛网页制作WEB标准化版块参加讨论,我还想发表评论

相关文章 更多相关链接
JavaScript获取事件对象的注意点
JavaScript 浮动定位提示效果
给JavaScript新手的24条实用建议
JavaScript优化细节
JavaScript 实现 Konami Code
作者文章
解读javascript的计时器 II
使用jQuery改进文件上传控件
自适应css布局——流动布局新时代
图像替换新技术:状态域方法
关键字搜索 常规搜索 推荐文档
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
周大福“敬•自然”设计大赛开启
国际体验设计大会7月将在京举行
中国国防科技信息中心标志征集
云计算如何让安全问题可控
云计算是多数企业唯一拥抱互联网的机会
阿里行云
云手机年终巨献,送礼标配299起
阿里巴巴CTO王坚的"云和互联网观"
1499元买真八核 云OS双蛋大促
首届COCO桌面手机主题设计大赛
栏目最新 栏目最新列表
浅谈JavaScript编程语言的编码规范
如何在illustrator中绘制台历
Ps简单绘制一个可爱的铅笔图标
数据同步算法研究
用ps作简单的作品展示页面
CSS定位机制之一:普通流
25个最佳最闪亮的Eclipse开发项目
Illustrator中制作针线缝制文字效果
Photoshop制作印刷凹凸字体
VS2010中创建自定义SQL Rule
>> 分页 首页 前页 后页 尾页 页次:2/31个记录/页 转到 页 共3个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
网站可用性测试及优化指南
《写给大家看的色彩书1》
《跟我去香港》
众妙之门—网站UI 设计之道
《Flex 4.0 RIA开发宝典》
《赢在设计》
犀利开发—jQuery内核详解与实践
作品集 更多内容

杂⑦杂⑧ Gold NORMANA V2