Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript事件监听器在汇编语言中编译成什么_Javascript_Performance_Assembly_Web - Fatal编程技术网

javascript事件监听器在汇编语言中编译成什么

javascript事件监听器在汇编语言中编译成什么,javascript,performance,assembly,web,Javascript,Performance,Assembly,Web,我正在研究javascript事件侦听器的性能,并试图更好地理解它们。我的问题是事件侦听器在汇编语言中是什么样子的,比如它编译成什么?同样,当javascript中触发事件时,执行的汇编代码指令集是什么。不一定要寻找精确的x_86代码,但一个概述会很好,我似乎无法在网上找到任何 由于几个原因,很难看出你的问题有多大意义。让我解释一下它是如何工作的,然后也许你会明白为什么你的问题没有一个直接的答案 首先,javascript是一种解释语言。它被解析成自己的字节码,然后由解释器执行字节码。在某种程度

我正在研究javascript事件侦听器的性能,并试图更好地理解它们。我的问题是事件侦听器在汇编语言中是什么样子的,比如它编译成什么?同样,当javascript中触发事件时,执行的汇编代码指令集是什么。不一定要寻找精确的x_86代码,但一个概述会很好,我似乎无法在网上找到任何

由于几个原因,很难看出你的问题有多大意义。让我解释一下它是如何工作的,然后也许你会明白为什么你的问题没有一个直接的答案

首先,javascript是一种解释语言。它被解析成自己的字节码,然后由解释器执行字节码。在某种程度上,您可以说它有自己的指令集,而不是使用CPU指令集。有各种级别的字节码优化,以使事情尽可能快,而具体的实现方式因实现而异。但是,足以说明JavaScript没有完全编译成所有的x86汇编指令,比如C或C++。因此,没有一组精确的x86指令唯一地对应于给定的一组javascript

第二,这里涉及的系统有多个层次。在最底层,是操作系统、驱动程序和事件子系统创建了这些事件,如鼠标向下或按键向下。该代码很可能是用C/C++编写的,并且已经简化为汇编语言。上一层是位于操作系统顶部的浏览器事件系统。这就是与操作系统的接口,使网页中的控件实际工作并捕获实际事件。然后,更上一层的是javascript接口,它允许javascript脚本注册一个事件处理程序,该事件处理程序将在事件发生时被调用

我们可以从概念上解释它是如何工作的,但不能在x86汇编指令级别上解释。概念上:

  • JS代码调用
    elem.addEventListener(“单击”,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事件处理代码:

    出于几个原因,很难看出您的问题有多大意义。让我解释一下它是如何工作的,然后也许你会明白为什么你的问题没有一个直接的答案

    首先,javascript是一种解释语言。它被解析成自己的字节码,然后由解释器执行字节码。在某种程度上,您可以说它有自己的指令集,而不是使用CPU指令集。有各种级别的字节码优化,以使事情尽可能快,而具体的实现方式因实现而异。但是,足以说明JavaScript没有完全编译成所有的x86汇编指令,比如C或C++。因此,没有一组精确的x86指令唯一地对应于给定的一组javascript

    第二,这里涉及的系统有多个层次。在最底层,是操作系统、驱动程序和事件子系统创建了这些事件,如鼠标向下或按键向下。该代码很可能是用C/C++编写的,并且已经简化为汇编语言。上一层是位于操作系统顶部的浏览器事件系统。这就是与操作系统的接口,使网页中的控件实际工作并捕获实际事件。然后,更上一层的是javascript接口,它允许javascript脚本注册一个事件处理程序,该事件处理程序将在事件发生时被调用

    我们可以从概念上解释它是如何工作的,但不能在x86汇编指令级别上解释。概念上:

  • JS代码调用
    elem.addEventListener(“单击”,fn)
  • 此代码调用
    addEventListener