《JavaScript异步编程》试读:1.1.3 队列

调用setTimeout的时候,会有一个延时事件排入队列。然后setTimeout调用之后的那行代码运行,接着是再下一行代码,直到再也没有任何代码。这时JavaScript虚拟机才会问:“队列里都有谁啊?” 如果队列中至少有一个事件适合于“触发”(就像1000毫秒之前设定好的那个为期500毫秒的延时事件),则虚拟机会挑选一个事件,并调用此事件的处理器(譬如传给setTimeout的那个函数)。事件处理器返回后,我们又回到队列处。 输入事件的工作方式完全一样:用户单击一个已附加有单击事件处理器的DOM(Document Object Model,文档对象模型)元素时,会有一个单击事件排入队列。但是,该单击事件处理器要等到当前所有正在运行的代码均已结束后(可能还要等其他此前已排队的事件也依次结束)才会执行。因此,使用JavaScript的那些网页一不小心就会变得毫无反应。 你可能听过事件循环这个术语,它是用于描述队列工作方式的。所谓事件循环,就像代码从一个循环中不断取出而运行一样: runYourScript(); while (atLeastOneEventIsQueued) { fireNextQueuedEvent(); }; 这隐含着一个意思,即触发的每个事件都会位于堆栈轨迹的底部。关于这一点,1.4节会进一步阐述。 事件的易调度性是JavaScript语言最大的特色之一。像setTimeout这样的异步函数只是简单地做延迟执行,而不是孵化新的线程。JavaScript代码永远不会被中断,这是因为代码在运行期间只需要排队事件即可,而这些事件在代码运行结束之前不会被触发。 下一节将更细致地考查异步JavaScript代码的构造块。

>JavaScript异步编程

JavaScript异步编程
作者: Trevor Burnham
副标题: 设计快速响应的网络应用
原作名: Async JavaScript: Build More Responsive Apps with Less Code
isbn: 7115316570
书名: JavaScript异步编程
页数: 118
译者: 许青松
定价: 32.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2013-6