认识延迟时间为 0 的 setTimeout
作者:realazy 来源:realazy博客 发布时间:2008-04-04 16:37:00
由 John Resig 的 How JavaScript Timers Work 可以知道,现有的 JavaScript 引擎是单线程处理任务的。它把任务放到队列中,不会同步去执行,必须在完成一个任务后才开始另外一个任务。
让我们看看我之前的文章:JavaScript的9个陷阱及评点,在第 9 点 Focus Pocus 中提到的问题。原作者对这个认识有所偏差,其实不只是 IE 的问题,而是现有 JavaScript 引擎对于线程实现的问题(关于线程,我的概念其实不多,如果不对,希望读者多多指教)。
我们通过一个例子来说明,请访问 settimeout.html.
我们来看 1 和 2。如果你能看看源代码,会发现我们的任务很简单,就是给文档增加一个 input
文本框,并聚焦和选中。请现在分别点击一下,可以看到,1 并没有能够聚焦和选中,而 2 可以。它们之间的区别在于,在执行
input.focus();
input.select();
时, 2 多了一个延迟时间为 0 的 setTimeout
的外围函数,即:
setTimeout(function(){
input.focus();
input.select();
}, 0);
按照 JavaScript: The Definitive Guide 5th 的 14.1 所说:
在实践中,
setTimeout
会在其完成当前任何延宕事件的事件处理器的执行,以及完成文档当前状态更新后,告诉浏览器去启用setTimeout
内注册的函数。
其实,这是一个把需要执行的任务从队列中跳脱的技巧。回到前面的例子,JavaScript 引擎在执行 onkeypress
时,由于没有多线程的同步执行,不可能同时去处理刚创建元素的 focus
和 select
事件,由于这两个事件都不在队列中,在完成 onkeypress
后,JavaScript 引擎已经丢弃了这两个事件,正如你看到的例子 1 的情况。而在例子 2 中,由于setTimeout
可以把任务从某个队列中跳脱成为新队列,因而能够得到期望的结果。
这才是延迟事件为 0 的setTimeout
的真正目的。在此,你可以看看例子 3,它的任务是实时更新输入的文本,现在请试试,你会发现预览区域总是落后一拍,比如你输 a, 预览区并没有出现 a, 在紧接输入 b 时, a 才不慌不忙地出现。其实我们是有办法让预览区跟输入框同步地,在此我没有给出答案,因为上面所说的,就是解决思路,try it yourself!


猜你喜欢
- 我们通过单体模式理解了是以对象字面量的方式来创建单体模式的;比如如下的对象字面量的方式代码如下:var singleMode = { &nb
- 网上有很多提供在线按钮制作、文字标题制作、Logo制作服务的网站,它们可以非常方便了让大家轻松的获得效果出色的各类图标型的图片,下面就快来看
- Sql Server 中一个非常强大的日期格式化函数: 获得当前系统时间,GETDATE(): 2008年01月08日 星期二 14:59
- Haar特征哈尔特征使用检测窗口中指定位置的相邻矩形,计算每一个矩形的像素和并取其差值。然后用这些差值来对图像的子区域进行分类。haar特征
- 一、普通用法 (手动调整size)view()相当于reshape、resize,重新调整Tensor的形状。import torcha1
- 首先我们的目标是这样子的:那么他有什么成分呢?有圣诞树的本体、大小蝴蝶结、星星、圣诞帽和袜子。首先我们来画圣诞树的本体。1. 圣诞树的本体圣
- 这篇文章主要介绍了Spring Cloud Feign高级应用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 在广大网友心目中,他们就是中国互联网搜索领域的三驾马车。无论这三家搜索巨头承不承认,在网友眼中总会来将他们进行对比比较。当然,更多时候的比较
- 分享一个新增备案不关站的代码,这里只是转帖,没有亲自实验,如有问题请及时反馈。其实就是利用API接口的IP查询地址来限制首页不被所在省的IP
- 前言虽然标题是全站,但目前只做了等级 top 100 直播间的全天弹幕收集。弹幕收集系统基于之前的B 站直播弹幕姬 Python 版修改而来
- 怎样压缩sql server2000的数据库备份文件,像rar一样?小弟有一7m的sql server2000 数据库备
- logging库提供了两个可以用于日志滚动的class(可以参考https://docs.python.org/2/library/logg
- python中向上取整可以用ceil函数,ceil函数是在math模块下的一个函数。向上取整需要用到 math 模块中的 ceil() 方法
- 一、提要 随着 python 的普及,越来越多的功能可用于 python 编码。使用此功能可以用更少的行和更清晰的
- 问题描述MySQL函数或者存储过程中使用group_concat()函数导致数据字符过长而报错CREATE DEFINER=`root`@`
- channel首先明确一下channel的作用:用于go协程间的通信。go语言最大的特点就是支持高并发:goroutine和channel是
- 我通过如下的一段程序发送post请求:import urllib3pool = urllib3.connection_from_url(
- parentNode和parentElement功能一样,childNodes和children功能一样。但是parentNode和chil
- 1.在列属性中加入事件 { &
- 本文假设某些特定类型的文件和大小为0的文件为垃圾文件,可以自由扩展代码的列表,也就是垃圾文件的类型。from os.path import