事件绑定算不算异步? 异步和 event-loop jQuery-1.5 之后的 ajax 事件绑定算不算异步? 如果你认真看了上一节的 event-loop 的,你会发现原来事件绑定和异步操作的实现机制是一样的,那么事件绑定是不是就是异步操作呢?(声明一下,这里说的事件绑定是如下代码的形式) $btn.on('click', function (e) { console.log('你点击了按钮') }) PS:这个问题貌似没有加过有人讨论或者发起讨论,但是当我了解了 event-loop 之后,我就发现这两者有很大联系,很早就像讨论一下这个话题。不知道哪位同仁跟我有一样的想法? 本节内容概述 共同之处 不同之处 我的观点 共同之处 从技术实现以及书写方法上来讲,他们是一样的。例如事件绑定和 IO 操作的写法基本相同 $btn.on('click', function (e) { console.log('你点击了按钮') }) fs.readFile('data1.json', function (err, data) { // 获取数据 }) 最终执行的方式也基本一样,都会被放在 call-stack 中通过 event-loop 来调用。 不同之处 在我看来至少有两处不同。 第一,event-loop 执行时,调用的源不一样。异步操作是系统自动调用,无论是setTimeout时间到了还是$.ajax请求返回了,系统会自动调用。而事件绑定就需要用户手动触发 第二,从设计上来将,事件绑定有着明显的“订阅-发布”的设计模式,而异步操作却没有。 我的观点 我个人看代码比较偏重设计,一个东西是什么要看它是为什么而设计的。因此,我倾向于事件绑定不是异步操作。虽然它也是通过 event-loop 实现调用的,但是它的设计目录却和异步操作完全不一样。 其实,事件绑定在 js 中扮演着非常重要的角色,各个地方都会用到事件绑定的形式。例如 web 页面监控鼠标、键盘,以及 nodejs 中的 EventEmitter 应用非常广泛(特别是涉及到数据流时)。而事件绑定被应用到非常广泛,却没有发生像异步操作带来的程序逻辑问题,反而大家用的非常开心————这又一个两者不一样的例证。 如果你觉得我的观点有问题,也可以大胆提出自己的建议和意见,发表出来!说对说错都无所谓,也不会扣你落户积分,只要能自圆其说就是好的。 异步和 event-loop jQuery-1.5 之后的 ajax