1. 为什么需要JavaScript引擎呢?

  • 高级的编程语言都是需要转成最终的机器指令执行的

  • 我们编写的JavaScript无论交给浏览器和Node执行,最后都是被CPU执行的

  • CPU只认识自己的指令集,实际上是机器语言,才可以被CPU所执行

  • 所以需要借助JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行

  1. V8引擎的原理

第一阶段:1--2

  • JavaScript源代码通过Parse将JavaScript转换成AST(抽象语法树) 如果函数没有运行就不会被转换成AST的

第二阶段:2--3

  • 然后利用Ignition解释器 会将AST转换成ByteCode字节码

  • 同时Ignition会收集TurboFan优化需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算)

  • 如果函数只调用一次 Ignition会执行解释ByteCode

  • TurboFan是一个编译器 将字节码编译为机器码

  • 如果一个函数多从被调用就会被标记为热点函数,那么就会经过TurnboFan直接转换成机器码 提高到代码执行性能

  • 但是也会被还原成ByteCode 这是因为函数执行过程中类型发生了变化 (比如刚开始函数传参传递的的都是number型,后来执行变成了string型)不能做出正确的处理运算 就会再次转换成字节码

第三阶段 3--4

  • 执行代码

  1. 那么JavaScript源码是如何编译成AST树呢?(Parse过程)

  • BlinK将源码交给V8引擎 Stream获取到源码并且进行编码转换;

  • 词法分析:Scanner会进行词法分析 词法分析会将代码换成tokens

  • 语法分析:经过Parser和PreParser,接下来tokens就会被转换成AST树

  • Parser是直接将tokens转成AST树架构

  • PreParser称为预解析 为什么需要预解析呢?

  • 这是因为并不是所有的JavaScript代码 在一开始都会被解析,(因为当前函数不确定会不会被执行)如果对所有JavaScript代码进行解析必然会影响网页的运行效率

  • 所以V8引擎就实现了,延迟解析的方案,它的作用就是将不必要的函数进行预解析,也就是只解析暂时需要的内容,而对函数的全量解析会在函数被调用时才会及进行

  • 比如我们在一个函数内部定义了另外一个函数inner 那么inner函数就会进行预解析

  • 生成AST树后 (编译阶段结束),会被Ignitiom转成字节码,之后的过程就是代码的执行过程

假如我们有下面一段代码 他在JavaScript是如何执行的呢?

  • JS引擎在编译阶段的时候,会在堆内存中创建一个对象 :Global Object(GO)

  • 该对象所有作用域都可以访问

  • 里面会包含 Date Array String Number setTimeout setInterval 等

  • 还有一个window属性指向自己(window.window.window)

  • js引擎内部有一个执行上下文栈 简称ESC 它是用于执行代码的调用栈(开始执行代码)

  • 全局的代码块执行会在执行栈中创建一个GEC(全局执行上下文)包含两部分

  • 第一部分:存放编译阶段存放的GO对象,这个过程也称之为变量的作用域提升

  • 第二部分:在代码执行中,对变量进行赋值,或者执行其他函数

  • 此时代码就会一行一行的执行

  • 当我们先consloe.log(name) 由于name存在变量提升,会先读取GO对象中的name,而此刻的name就是默认的undefind

  • 遇到函数怎么解析

第一步 编译阶段会在全局对象GO中增加一个foo变量,会在堆内存中开辟一个新地址,该内存保存父级作用域和函数体,foo变量指向该内存地址 词法分析阶段已经确定了函数的作用域

第二步,在编译阶段会创建一个AO对象,该对象中包含形参,arguments ,定义的变量,该阶段还未手动赋值,默认就是undefind

第三步 在执行函数的时候会创建一个函数执行上下文对象叫做 FEC,FEC中包含三部分

第一部分:存放编译阶段生成的AO对象

第二部分:作用域链,由VO和父级VO组成,查找时会一层一层查找

第三部分:this绑定的值

第四步开始一行一行执行js代码

V8引擎解析JavaScript原理相关推荐

  1. 《十》浏览器基础及渲染引擎解析一个网页的过程、JavaScript 引擎解析 JavaScript 代码的过程

    浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互. 服务器其实就是性能比较高的计算机,这些计算机 24 小时不断电. 不关机. 开发者在本地开发出 HT ...

  2. 浏览器原理-v8引擎-js执行原理

    浏览器原理-v8引擎-js执行原理 js简介 js应用: js的应用很广泛 可以应用于web,移动端,小程序,桌面应用,后端开发等 web开发包括(原生js,react,vue,angular等) 移 ...

  3. 浏览器解析JavaScript原理

    1.浏览器解析JavaScript原理特点: 1.跨平台  2.弱类型 javascript 定义的时候不需要定义数据类型,数据类型是根据变量值来确定的.    var a = 10; 数字类型   ...

  4. V8引擎-js执行原理

    ​ 前言: 今天小编给大家讲解一下小伙伴们心中一直存在的问题,那就是我们在使用node环境或者浏览器的时候为什么可以执行js代码? 我们定义了很多的变量和函数内部是如何处理的? 以及我们常常说的作用域 ...

  5. JavaScript怎么安装_几句话说清楚JavaScript、V8引擎、NodeJS、NMP,到底是什么东东...

    小程序开发如火如荼,如果你是程序员,你还不懂小程序的开发,恐怕会被同行认为太LOW了吧!不过,新入行小程序开发者确实会被新的名词搞得一头雾水. 比如JavaScript不是在浏览器端运行吗,怎么还可以 ...

  6. JavaScript 工作原理(二)-如何在 V8 引擎中书写最优代码的 5 条小技巧(译)

    From:https://segmentfault.com/a/1190000014770145 原文请查阅这里,略有删减. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScrip ...

  7. JavaScript 工作原理之二-如何在 V8 引擎中书写最优代码的 5 条小技巧(译)

    原文请查阅这里,略有删减. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第二章. 本章将会深入谷歌 V8 引擎的内部结构.我们也会为如何书写更好的 Java ...

  8. V8引擎:编译器和解析器是如何执行一段javascript代码的?

    前言 前面我已经说完了js引擎是如何存储数据,如何回收垃圾的,但这只是基础罢了,并不是v8引擎的最主要任务,接下来我要讲v8引擎的核心:如何执行js代码,为什么要学习这些东西呢? 前端工具和框架的自身 ...

  9. JavaScript工作原理(二):V8引擎和5招高效代码

    本系列的第一篇文章重点介绍了引擎,运行时和调用栈的概述.第二篇文章将深入V8的JavaScript引擎的内部.我们还会提供一些关于如何编写更好的JavaScript代码的技巧. 概述 JavaScri ...

最新文章

  1. 怎么用python画个电脑_python语言还是java如何用python画爱心
  2. [译] 如何写一篇杀手级的软件工程师简历
  3. redhat及deban系列linux软件管理的一些问题
  4. linux字符设备led驱动源码,字符设备驱动控制LED灯
  5. 初中数学503个必考知识点_初中数学无非就这146个必考知识点,全摸透,轻松应对考试!...
  6. JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象
  7. Project Honolulu 正式版发布为 Windows Admin Center
  8. 2019.4.26今日任务
  9. Apache常见配置及问题
  10. 【转】Google Chrome浏览器调试
  11. 计算机二级教程第十章答案,2012年计算机二级VFP考试第十章课后练习题及答案...
  12. 没有加载jawt导致java.lang.UnsatisfiedLinkError
  13. python 参数一样结果不一样_优化Keras的超参数:相同参数的结果不同
  14. 小米笔记本pro充电测试软件,小米笔记本 Pro 评测:高端已成,性价比不变
  15. python文件加减法_python生成PDF文件20以内加减法,给上小学的宝宝
  16. Pytorch学习——池化层
  17. 垃圾小白羊leetcode刷题记录1
  18. 接收信号强度值dbm分析
  19. Redis学习、缓存、持久化、哨兵模式
  20. BEA助中国一汽构建核心ERP系统

热门文章

  1. 计算机打80000音乐,抖音emm想你想我bgm是什么 80000完整歌词介绍
  2. [HIHO1560] H国的身份证号码II(dp,计数,矩阵快速幂)
  3. Java调用百度API实现文本与图像审核功能
  4. 学习笔记12--环境感知传感器技术之激光雷达
  5. 如何成为安卓软件开发工程师?
  6. 全国中小学教师计算机水平考试,全国中小学教师教育技术水平考试网
  7. 「数字电子技术基础」3.逻辑代数基础
  8. 12万游戏账号一夜被封杀
  9. python socket使用UDP控制继电器进行硬件产品循环开关机测试
  10. Excel VBA:打开与关闭工作簿——Workbooks对象