当前位置:编程学习 > JAVA >>

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翻译成“句柄”感觉不恰当,不过似乎也没有更精炼更贴切的表达。

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,