javascript事件监听器在汇编语言中编译成什么?
what do javascript event listeners compile to in assembly language
我正在观察javascript事件侦听器的性能,并试图更好地理解它们。我的问题是事件监听器在汇编语言中是什么样子的,比如它编译成什么?同样,当javascript中的事件触发时,执行的汇编代码指令集是什么?不一定要寻找确切的x_86代码,但概述会很好,我似乎找不到任何在线。
很难看出你的问题有什么意义,原因有几个。让我解释一下这是如何工作的,然后也许你就会明白为什么你的问题没有一个直接的答案。
首先,javascript是一种解释性语言。它被解析成它自己的字节码,然后字节码由解释器执行。在某种程度上,你可以说它有自己的指令集,而不是使用CPU的指令集。有各种级别的字节码优化,以使事情尽可能快,具体是如何做到这一点因实现而异。但是,足以说明的是,javascript并没有像C或c++那样完全编译成所有x86汇编指令。因此,没有一组精确的x86指令唯一地对应于一组给定的javascript。
第二,这里涉及到系统的多个层次。在最底层,有操作系统,它的驱动程序和事件子系统,它创建这些事件,如mouseDown或keyDown。这些代码可能会用C/c++编写,并被简化为汇编语言。再上一层,是位于操作系统之上的浏览器事件系统。这是与操作系统的接口,并使网页中的控件实际工作并捕获实际事件。然后,再往上一层是javascript接口,它允许javascript脚本注册一个事件处理程序,当事件发生时将被调用。
我们可以从概念上解释这是如何工作的,但不能在x86汇编指令级别解释。从概念上讲:
- JS代码调用
elem.addEventListener("click", fn);
- 此代码调用本地对象
elem
的addEventListener
方法。 - 由于addEventListener可能没有在javascript中实现(更有可能在"C/c++"浏览器中实现),代码经过接口层,其中参数被打包成正确的形式,并调用C/c++函数/方法。这个方法为每个对象维护一个事件处理程序列表。出于性能原因,该列表可能按事件类型组织。事件类型和要调用的JS函数存储在与特定DOM元素关联的列表中。
- 当特定DOM元素发生事件时,浏览器中的C/c++引擎会检测到该事件。然后,该引擎检查该DOM对象的事件处理列表,以查看是否有对该特定事件感兴趣的该DOM对象的任何事件处理程序。如果有,则设置调用事件处理程序。 再次调用处理程序的代码必须通过从C/c++返回到javascript世界的接口层。事件数据结构被构建和填充,然后用所有正确的参数调用事件处理器。
- 当事件处理程序返回时,同一DOM对象上的任何其他事件处理程序也会被调用。
- 如果这是一个正在传播的事件,并且事件传播还没有被任何事件处理程序阻止,那么该事件将通过父级向上传播,再次寻找匹配的事件处理程序来调用。
- 根据事件的类型,如果该事件存在默认行为(如点击链接)并且默认行为未被阻止,则执行默认动作(默认行为可能在传播之前)。
供参考,如果你想看浏览器的C/c++代码来处理事件处理,你可以去看看webkit或Firefox的源代码,因为它们都是开源的。但是,这只是机制的一部分,因为系统的其他部分、浏览器和JS解释器都涉及到。
很多webkit事件处理代码可以在这里找到:https://github.com/WebKit/webkit/tree/e7207313fed4b7a2140c39f65d45e0f441731735/Source/WebCore/dom
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 全局变量和全局对象的属性之间有什么区别吗
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 将dart编译为javascript的限制是什么
- 将非类型化数组编译为 C 的有效方法是什么?
- 将类似JavaScript的结构编译为静态,快速C++的最佳方法是什么?
- 这些缓存.js和编译映射文件是什么
- 我如何知道在运行 V8 时编译了什么 JavaScript
- typescript编译到什么版本的javascript
- 编译后的jst模板中的this是什么
- 检查和编译之间的区别是什么?
- 在编译完文件中的所有CSS和另一个文件中的JS之后,接下来的步骤是什么?
- 什么时候(编译/运行时)一个依赖的节点模块被链接到项目时,它是require()'
- 用ES6编写和编译到ES5对最终用户有什么好处?
- javascript事件监听器在汇编语言中编译成什么?
- 究竟什么是 JavaScript 编译指示
- 链接、控制器和编译函数中的各种注入物是什么