你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Web开发
javascript Event Loop 小结
 

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

[javascript] 
status.innerText = 'doing...please wait...';  
即原文所谓“由于涉及DOM更新,由DOM Change Event触发另一个线程,所以排到队尾”。


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

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


小结如下:

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


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


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


接下来回到javascript的世界:
[javascript] 
status.innerText = 'doing...please wait...';  
 这一句,实际上已经将dom(或者说html)的内容变更了, 紧接着系统会触发dom changed事件,即逐一回调所有挂载在该事件上的各个方法。
 因为事件回调本来就是异步的,数量亦不可知(取决于运行时有多少对象监听/订阅了这个事件),因此无需立即同步执行,而只是简单地把每个方法追加到队列中。
 而其中至少有一个回调是GUI渲染线程负责的repaint动作。
 
 这就是为什么执行完这一句,排了个event callback到队尾的原因。
 
 我觉得正确的表述应该是“由于DOM Change Event被触发,产生一组异步回调,因此每个回调方法都被追加到队列中,而其中必然包括GUI渲染线程负责的repaint方法。”
 
btw,handler的意思有“着手处理事情的人、驯兽(狗)员、(拳击)教练、经理”,此处可以理解成着手处理事件的对象。
handle才有“把手、手柄,处理”的意思,因此有些地方把handler翻译成“句柄”感觉不恰当,不过似乎也没有更精炼更贴切的表达。

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089