javascript Event Loop 小结

来源:互联网 发布:分享seo与网络营销 编辑:程序博客网 时间:2024/06/06 09:28

原文见:http://heroicyang.com/blog/javascript-event-loop.html

读完一遍后,有一点没理解:为什么在执行这句的时候,会追加一个event callback到队尾。

 status.innerText = 'doing...please wait...'; 

即原文所谓“由于涉及DOM更新,由DOM Change Event触发另一个线程,所以排到队尾”。


因此先复习了一遍C#的事件委托机制,希望从C#优雅简洁的语法中巩固基础、寻找突破。

复习的文章见:http://www.codeproject.com/Articles/1474/Events-and-event-handling-in-C

有点基础的可以直接从Explanation这一节开始看。


小结如下:

在C#的语法中,delegate(委托)是一个关键字,类似于class负责定义类,它负责定义委托类型。
委托类型一般命名为XxxEventHandler,暗示处理某类事件的人。
它的用途仅仅是声明一个方法签名,所有符合这个方法签名的方法,都可以挂载到该委托类型的某个实例,即event(事件)上。
如click,doubleClick,KeyPress等,对于这些不同的事件,只要处理的方法签名一致,可以共用一种委托类型。


挂载的目的是当触发该事件时就会逐一触发所有已挂载的方法,以完成事件回调机制。
可以形象地理解成n个人订报,挂载的动作就是订阅某个报刊。以后每当该报刊派发,所有订阅的人都会收到。
所谓订阅者、观察者、监听者都是在描述类似的意思,即事件被触发后,所有订阅/监听/观察该事件的对象都能收到通知,以便各自执行不同回调动作。


事件对应的被触发方法,一般命名为onXxxEvent(),如onClick()。其实现即触发该事件上挂载的所有方法。
事件上挂载的每一个方法,一般来各个XxxListener。


接下来回到javascript的世界:

 status.innerText = 'doing...please wait...'; 
 这一句,实际上已经将dom(或者说html)的内容变更了, 紧接着系统会触发dom changed事件,即逐一回调所有挂载在该事件上的各个方法。
 因为事件回调本来就是异步的,数量亦不可知(取决于运行时有多少对象监听/订阅了这个事件),因此无需立即同步执行,而只是简单地把每个方法追加到队列中。
 而其中至少有一个回调是GUI渲染线程负责的repaint动作。
 
 这就是为什么执行完这一句,排了个event callback到队尾的原因。
 
 我觉得准确的表述应该是“由于DOM Change Event被触发,产生一组异步回调,因此每个回调方法都被追加到队列中,而其中必然包括GUI渲染线程负责的repaint方法。”

 
P.S. handler的意思有“着手处理事情的人、驯兽(狗)员、(拳击)教练、经理”,此处可以理解成着手处理事件的对象。
handle有“(门)把手、手柄,处理”的意思,有些地方把handle翻译成“句柄”,例如“窗口句柄”,初看实在是不知所云啊。其实老外就是想表述类似门把手可以牵引门,窗户把手可以控制窗户嘛。

原创粉丝点击