首先,事务驱动其实是一种代码模型,用于事件解耦的,具体可以搜索”事务驱动模型“。
简单来说是:
B一开始需要在特定地点,调用A里面的几个方法,B就需要在特定地点,调用a.func1(),a.func2()......,这是我们正常的逻辑。现在我们创造一个类Event,B只需要在特定地点给A传event对象,由event对象根据调用位置判断调用的是func1()还是func2()。
这就把逻辑从B转移到了event对象上。
我们知道Javascript是单线程、非阻塞式IO的,如果不清楚可以看我上一篇文章为什么说JS是阻塞 I/O的?简单举例告诉你什么是非阻塞 I/O!讲的很清楚了!
对比java、c++等语言,当你运行代码,代码读入内存中,按顺序从上往下执行所有代码。
但我们在写js的时候,经常会对标签元素绑定事件,这些代码也都读入内存中了,但没有马上执行,而是当你点击(对应click事件)、鼠标移动(对应mouse-move事件)时,调用该函数。
比如,放了一部电话在家里,但是电话要是没响,我们不会主动去「接电话」 (没人打来当然也无法主动接) ,这里电话响了就好比事件被触发,接电话就好比去做对应的事情。
电话响了(事件被触发) -> 接电话(去做对应的事)
我们称这种函数调用是异步的。其中,我们其实是把函数作为参数传给了EventTarget,此处的函数
就是回调函数。
事件的绑定的两种方式
一、EventTarget.addEventListener(<name>,<func>,<isBool>)
「事件名称」、「事件的处理程序」(事件触发时执行的function
),以及一个「Boolean」值,由这个Boolean决定事件是以「捕获」还是「冒泡」机制执行,若不指定则预设为「冒泡」。
二、EventTarget.xxxx = <func>