JavaScript高级(一)--V8引擎上

 浏览器渲染的原理

主流浏览器及其内核
内核浏览器css前缀备注
TridentIE4-IE11-ms最新的Edge已转向Blink
Gecko火狐浏览器-moz
Webkitsafari、旧版谷歌-webkit
BlinkGoogle Chrome-webkit
Prestoopera-o现在的opera转向了Blink

我们常说的浏览器内核指的就是浏览器的排版引擎,排版引擎(layout engine)也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样板引擎。

浏览器的渲染过程

浏览器会先下载HTML形成DOM树,在中途如果遇见CSS标签就开始下载CSS并解析,结合DOM树和CSS文件生成渲染树,浏览器根据渲染树,将页面绘制在屏幕上。如果在中途碰到JavaScript代码,会停止解析HTML和CSS,去执行JavaScript代码。

webkit内核和JS引擎的关系

WebCore:负责HTML解析、布局、渲染等等相关的工作

JavaScriptCore:解析、执行JavaScript代码

V8引擎如何解析和执行

Parse模块会将JavaScript代码转换成AST(抽象语法树abstract syntax tree),这是因为解释器不认识JavaScript代码

Ignition是一个解释器,会将AST转换成ByteCode(字节码)

  • 同时会收集TurboFan优化所需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算);
  • 如果函数只调用一次,Ignition会执行解释执行ByteCode

TurboFan是一个编译器,可以将字节码编译为CPU可以直接执行的机器码

  • 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能
  • 机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是 number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码(如果有一天JavaScript加入了类型检测,那么TypeScript可能会退出历史的舞台)
V8引擎执行细节

JavaScript源码是如何被解析(Parse过程)

  • Blink将源码交给V8引擎,Stream获取到源码并且进行编码转换
  • Scanner会进行词法分析(lexical analysis),词法分析会将代码转换成tokens;
  • 接下来tokens会被转换成AST树,经过Parser和PreParser:
    • Parser就是直接将tokens转成AST树架构
    • PreParser称之为预解析,为什么需要预解析(变量提升)呢?
      • 不是所有的JavaScript代码,在一开始时就会被执行。那么对所有的JavaScript代码进行解析,必然会影响网页的运行效率
      • 所以V8引擎就实现了Lazy Parsing(延迟解析)的方案,它的作用是将不必要的函数进行预解析,也就是只解析暂时需要的内容,而对函数的全量解析是在函数被调用时才会进行
  • 生成AST树后,会被Ignition转成字节码(bytecode),之后的过程就是代码的执行过程
JavaScript代码执行过程
  • JS在执行代码之前会在堆内存中创建一个全局对象Global Object(初始化全局对象GO)
    • 该对象的Scope所有作用域都可以访问
    • 里面会包含Date、String、Array、setTimeout等等。。。
    • 其中还包含一个window属性指向自己
  • js引擎内部有一个执行上下文栈(Execution Context Stack,简称ECS),它是用于执行代码的调用栈。
    • 那么现在它要执行谁呢?执行的是全局的代码块:
      • 全局的代码块为了执行会构建一个 Global Execution Context(GEC)
      • 全局执行上下文(GEC)会被放入到执行上下文栈(ESC)中执行
  • GEC被放入到ECS中里面包含两部分内容
    • 第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中但是并不会赋值(变量提升)
    • 第二部分:在代码执行中,对变量赋值,或者执行其他的函数
  • GEC被放入到ECS中GEC开始执行代码

image.png

  • 执行过程中遇到函数如何执行?

    • 在执行的过程中执行到一个函数时,就会根据函数体创建一个函数执行上下文(Functional Execution Context,简称FEC),并且压入到EC Stack中。
    • FEC中包含三部分内容:
      • 在解析函数成为AST树结构时,会创建一个Activation Object(AO)
      • 作用域链:由VO(在函数中就是AO对象)和父级VO组成,查找时会一层层查找;
      • this绑定的值
  • FEC被放入到ECS中

  • FEC开始执行代码

九道变量提升、预编译面试题

//1
var n = 100
function foo() {
    n = 200
}
console.log(n) // 100


//2
var a = 100
function foo() {
    console.log(a) // undefined
    return 
    var a = 100 
}
foo()


//3
function foo() {
    console.log(n)  // undefined
    var n = 200
    console.log(n) // 200
}

var n = 100
foo()


//4
   function foo() {
        // 这里a是局部变量,b是全局变量
        var a = b = 100
   }
   foo()
   console.log(a,b) //a is not defined,100


//5
    var n = 100
    function foo1() {
        console.log(n) // 100
    }
    
    function foo2() {
        var n = 200
        console.log(n) // 200
        foo1()
    }
    foo2()
    console.log(n) // 100

//6
    function fn(a) {
        console.log(a) // fn
        var a = 123
        console.log(a) // 123
        
        function a(){}
        console.log(a) // 123
        
        var b = function(){}
        console.log(b) // fn
        
        function d(){}
    }
    fn(1)


//7
    console.log(test) // fn
    
    function test(){
        console.log(test) // fn
        var test = 234
        console.log(test) // 1234
        function test(){}
    }
    
    test(1)
    var test = 123



//8
    function demo() {
        console.log(b) // undefined
        if(a) {
            var b = 100
        }
        console.log(b) // undefined
        c = 234
        console.log(c) // 234
    }
    var a 
    demo()
    a = 10
    console.log(c) // 234


//9
    a = 100
    
    function demo(e) {
        function a(){}
        
        arguments[0] = 2
        console.log(e) // 2
        
        // if中之前不可以写函数,现在似乎可以,不争论,按照可以写来推论结果
        if(a) {
            var b = 123
            var c = function(){}
        }
        
        var c
        a = 10
        var a 
        console.log(b) // 123
        f = 123
        console.log(c) // fn
        console.log(a) // 10
        
    }
    var a 
    demo(1)
    console.log(a) // 100
    console.log(f) // 123
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/491673.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【No.20】蓝桥杯简单数论下|寻找整数|素数的判断|笨小猴|最大最小公倍数|素数筛|埃氏筛|欧氏线性筛|质数|分解质因子(C++)

寻找整数 【题目描述】 有一个不超过 1 0 1 7 10^17 1017的正整数n,知道这个数除以2至49后的余数如下表所示,求这个正整数最小是多少 解法一:模拟 暴力法:一个个检验 1 … 1 0 17 1\dots 10^{17} 1…1017的每个数 由于这个数n…

证券公司数据摆渡,如何兼顾安全性、可控性和效率?

根据国家和金融行业的法律法规要求,我国的证券公司不少采用网络隔离的方式将内部网络隔离为操作内网和操作外网,但网络隔离后,证券公司的操作内外网间仍需要进行数据交换,如提数、与第三方合作机构的数据外发和收取等业务需求&…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板,顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…

MySQL数据库的高级SQL语句与高级操作(1)

目录 以下例子都是基于该数据表 1、查询不重复记录(distinct) 2、and 、or:根据多条件查询 3、IN ----显示已知的值的数据记录 4、BETWEEN ----显示两个值范围内的数据记录 5、 like通配符:模糊查询 6、order by&#xff1a…

vlan、三层交换机、网关、DNS、子网掩码、MAC地址详解

vlan、三层交换机、网关、DNS、子网掩码、MAC地址详解 一、 什么是VLAN? VLAN中文是“虚拟局域网”。 ​ LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。 ​ VLAN所指的LAN特指使用路由器分割的网络——也就是广…

【数字图像处理】改变图像灰度级别

改变图像灰度级别 首先,对原始图像 O O O进行灰度级量化: q int ⁡ ( O 2 i ) 2 i , q\operatorname{int}\left(\frac{O}{2^{i}}\right) \times 2^{i}, qint(2iO​)2i, 灰度级别256,128,64,32,16,8&…

FastAPI+React全栈开发08 安装MongoDB

Chapter02 Setting Up the Document Store with MongoDB 08 Installing MongoDB and friends FastAPIReact全栈开发08 安装MongoDB The MongoDB ecosystem is composed of different pieces of software, and I remember that when I was starting to play with it, there w…

QT_day5:使用定时器实现闹钟

1、 程序代码&#xff1a; widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTextToSpeech>//文本转语音类 QT_BEGIN_NAMESPACE namespace Ui { cla…

深度学习十大算法之图神经网络(GNN)

一、图神经网络的基础 图的基本概念 图是数学中的一个基本概念&#xff0c;用于表示事物间复杂的关系。在图论中&#xff0c;图通常被定义为一组节点&#xff08;或称为顶点&#xff09;以及连接这些节点的边。每个边可以有方向&#xff0c;称为有向边&#xff0c;或者没有方向…

C#学习笔记4:PC串口发送数据

今日继续我的C#学习之路&#xff0c;今日学习制作PC串口发送数据的窗口程序 串口是单片机上位机开发的重点&#xff0c;本文围绕做一个通过PC端串口发送数据的程序进行实践学习&#xff0c; 文章提供源码与解释、整体工程文件 目录 1、控件的选择与摆放&#xff1a; 2、程序设…

46 div 下面包含 el-radio, 导致点击一次 div, div 的 click 事件执行多次

前言 这是一个最近碰到的一个很奇怪的问题 情况如下一个 div 下面有一个 el-radio, 然后 div 上面配置了 click 的回调为 handleClick 然后 但是点击 div 的时候, handleClick 触发了两次 然后 这里 来模拟一下, 并解决一下 这个问题 这里的知识主要是 设计到 label 和 …

pytorch反向传播算法

目录 1. 链式法则复习2. 多输出感知机3. 多层感知机4. 多层感知机梯度推导5. 反向传播的总结 1. 链式法则复习 2. 多输出感知机 3. 多层感知机 如图&#xff1a; 4. 多层感知机梯度推导 简化式子把( O k O_k Ok​ - t k t_k tk​) O k O_k Ok​(1 - O k O_k Ok​)起个别名…

09-LearnTheArchitecture-MemoryManagement

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 1 Overview 本文介绍了 Armv8-A 中的内存转换&#xff0c;这是内存管理的关键。 它解释了虚拟地址如何转换为物理地址、转换表格式以及软件如何管理Translation Lookaside Buffe…

阿里云对象存储OSS入门

阅读目录 一、阿里云OSS的使用 1、OSS是什么&#xff1f;2、OSS的使用 二、阿里云OSS的使用三、图床的搭建四&#xff1a;图床绑定阿里云OSS 编写不易&#xff0c;如果我的文章对你有帮助的话&#xff0c;麻烦小伙伴还帮忙点个赞再走&#xff01; 如果有小伙伴觉得写的啰嗦&a…

【倪琴仲尼式-雷伴】全新倪诗韵精品杉木古琴

试音中的用弦&#xff1a;梦音&#xff0c;视频录音无任何处理&#xff0c;所见即所得。 现琴比照片更好看。倪琴吊牌、琴额后面的编码和倪琴官网上的序列号是一一对应的&#xff0c;可查。 雷伴&#xff0c;“伴”字取意陪伴、相伴、依随。栗壳色&#xff0c;纯鹿角霜生漆工艺…

C#打印50*30条码标签

示例图&#xff1a; 源码下载地址&#xff1a;https://download.csdn.net/download/tiegenZ/89035407?spm1001.2014.3001.5503

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(持续更新)

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛B题 解题全流程&#xff08;持续更新&#xff09; -----基于多模态特征融合的图像文本检索 一、写在前面&#xff1a; ​ 本题的全部资料打包为“全家桶”&#xff0c; “全家桶”包含&#xff1a;模型数据、全套代码、训练好的模…

解决npm init vue@latest证书过期问题:npm ERR! code CERT_HAS_EXPIRED

目录 一. 问题背景 二. 错误信息 三. 解决方案 3.1 临时解决办法 3.2 安全性考量 一. 问题背景 我在试图创建一个新的Vue.js项目时遇到了一个问题&#xff1a;npm init vuelatest命令出现了证书过期的错误。不过这是一个常见的问题&#xff0c;解决起来也简单。 二. 错误…

LabVIEW无人机大气数据智能测试系统

LabVIEW无人机大气数据智能测试系统 随着无人机技术的迅速发展&#xff0c;大气数据计算机作为重要的机载设备&#xff0c;在确保飞行安全性方面发挥着重要作用。设计了一套基于LabVIEW的无人机大气数据智能测试系统&#xff0c;通过高效、稳定的性能测试&#xff0c;及时发现…

Java八股文(SpringCloud Alibaba)

Java八股文のSpringCloud Alibaba SpringCloud Alibaba SpringCloud Alibaba Spring Cloud Alibaba与Spring Cloud有什么区别&#xff1f; Spring Cloud Alibaba是Spring Cloud的衍生版本&#xff0c;它是由Alibaba开发和维护的&#xff0c;相比于Spring Cloud&#xff0c;它在…