当前位置: 首页 > news >正文

JavaScript是如何执行的——V8引擎的执行

浏览器内核是由两部分组成的,以webkit为例:

  • WebCore:负责HTML解析、布局、渲染等等相关工作
  • JavaScriptCore:解析、执行JavaScript代码

有一个强大的JavaScript引擎就是v8引擎


V8引擎的执行原理

1.什么是V8引擎

  • 是用C++编写的高性能JavaScript和WebAssembly引擎
  • 可以实现JavaScript和WebAssembly在多个系统上的运行
  • 可以独立运行也可以嵌入到任何C++应用程序中

2.编译过程

  • JavaScript源代码
  • 解析(Parse)成AST抽象语法树
  • 点火(Ignition)过程编译成字节码(字节码可以到处运行了)
  • V8引擎会收集信息,将常用的代码通过TurboFan成优化过的机器码(不用再次解析)

V8引擎的架构

1.Parse模块

    会将JavaScript代码转换成AST,如果函数没有被调用,是不会被转换成AST的

2.Ignition解释器

    会将AST转换成ByteCode(字节码),这里同时会收集TurboFan优化所需要的信息,如果函数只调用一次,Ignition会解释执行ByteCode

3.TurboFan编译器

    会将字节码编译为CPU可以直接执行的机器码,如果一个函数被多次调用,就会被标记为热点函数。会被其转换为被优化的机器码,但是,如果在函数执行时,类型发生了变化,这里机器码实际上也会被还原成字节码

4.垃圾回收器

JavaScript在引擎中执行的过程

1.初始化全局对象

    js引擎会在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO),该对象所有的作用域都可以访问。里面会包含Date、Array、String、Number、setTimeout等等,其中还有一个window指向自己。

2.全局代码执行前后流程

(1)js引擎内部有一个执行上下文栈(ECS),用于执行代码的调用栈;

(2)全局的代码块为了执行会构建一个全局执行上下文(GEC),只要你想运行一个函数,都要先创建一个执行上下文;

(3)每一次执行上下文会关联一个变量对象(VO),变量和函数声明会被添加到这个VO对象中,对于全局上下文GEC来说,此时关联的就是GO;

(4)在代码运行之前,引擎会在GO中声明变量和函数对象,但是此时变量的值为underfind,函数指向的是函数对象的地址,函数是先被声明的;

(5)执行上下文处理关联VO,还会关联一个作用域链和this,然后开始执行代码;

3.函数执行前后过程

(1)创建函数执行上下文(FEC);

(2)进入一个FEC时,会创建一个AO对象,这个对象会使用arguments作为初始化,并且初始值是传入的参数,这个AO对象会作为执行上下文的VO来存储变量;

(3)执行代码;

4.作用域和作用域链

    当进入一个执行上下文时,执行上下文也会管理一个作用域链(Scope Chain),作用域链是一个对象列表,用于变量标识符的求值;

    当进入一个执行上下文时,做个作用域链被创建,并且根据代码类型,添加一系列的对象,这里要注意,在一个函数被创建时作用域链就确定了,而不是说和this指向一样。

http://www.dtcms.com/a/545508.html

相关文章:

  • GEO:AI 时代流量新入口,四川嗨它科技如何树立行业标杆? (2025年10月最新版)
  • 【牛客刷题-剑指Offer】BM24 二叉树的中序遍历:左根右的奇妙之旅(递归+迭代双解法详解)
  • 宝山网站建设哪家好平面设计免费模板网站
  • 腾讯云 怎样建设网站免费自助建站工具
  • elasticsearch中文分词器插件下载
  • 【开题答辩全过程】以 叮叮网上图书销售管理系统为例,包含答辩的问题和答案
  • 2025—2028年教育部面47项白名单赛事汇总表(正式版)
  • IPython.display 显示网页
  • Excel怎么根据身份证号码来计算年龄?
  • 江阴网站网站建设免费的舆情网站
  • 服务间的通信之gRPC
  • php做电商网站开题报告wordpress输密码访问
  • Mybatis中# 和 $的区别
  • IDEA开发常用快捷键总结
  • SAP HANA数据库HA双机架构概念及运维
  • Blender 4K渲染背后的技术挑战
  • 镇江建设集团网站扁平化wordpress
  • 测试开发话题05---用例篇(2)
  • 做个网站多少费用asp学习网站
  • 基于电鱼 ARM 工控机的井下设备运行状态监测方案——实时采集电机、电泵、皮带机等关键设备运行数据
  • 【代码审计】Doufox v0.1.1 任意文件读取 分析
  • 做php网站的环境微信网站小游戏
  • 做网站基本要求wordpress哪些文件需要给777
  • 不练不熟,不写就忘 之 compose 之 动画之 animateFloatAsState动画练习
  • 做物流网站的图片素材沈阳公司网站
  • 动态增减输入框并做校验
  • Matlab 开启并行池
  • 仓颉内存分配优化:从分配器到无分配编程的演进
  • MATLAB的KL展开随机场生成实现
  • MATLAB基于IOWA算子的投影法加权几何平均组合预测模型