当前位置: 首页 > Web前端 > JavaScript

Browser(网页浏览器)

时间:2023-03-27 10:25:16 JavaScript

Browser(网页浏览器)参考:百科全书:浏览器入门:浏览器、内核、浏览器内核、javascript引擎1.浏览器的组成浏览器大致由shell和kernel组成shell包括shell,菜单、用户界面等内核一般分为渲染引擎(排版渲染引擎、图形引擎)和javascript引擎(JS解释器)类似于DOS下的COMMAND.COM和后来的cmd.exe,它接收用户命令,然后调用相应的应用程序。2.主要流程主要流程渲染引擎获取内容后的基本流程:解析html构建dom树->构建渲染树->布局渲染树->绘制渲染树参考:https://blog.csdn.net/liyong1...3.浏览器内核技术浏览器内核主要包括以下三种科技文胸nches:排版渲染引擎,JavaScript引擎等4.浏览器内核(renderingengine,浏览器引擎,RenderingEngine)浏览器引擎(kernel,renderingengine)——用于查询和操作渲染引擎的接口例如:webkit[WebKit中包含的WebCore排版引擎和JavaScriptCore解析引擎],Trident,Gecko,Presto排版渲染引擎-用于显示请求的内容例如:WebCoreJavaScript引擎-用于“读取”JavaScript代码并解释执行JS代码例如:V85。在网络浏览器中。例如:由丹麦谷歌开发的V8是Chrome浏览器的一部分。6.JavaScript引擎工作原理参考:https://blog.csdn.net/a419419...6.1第一阶段:语法检查6.1.1词法分析JavaScript解释器首先将JavaScript代码的字符流(string)转换为符合ECMAScript标准的token流6.1.2语法分析JavaScript解析器,经过词法分析后,根据ECMAScript标准,将词法分析生成的token转换为语法树。通俗地说,就是将从程序中收集到的信息存储到数据结构中,每取一个词法标记,就送到语法分析器中进行分析。6.2Phase1:RunPhase6.2.1Pre-parsingStep1:Createanexecutioncontext.解析器将语法检查无误后生成的语法树复制到当前执行上下文中。第二步:属性填充。解析器会在语法树中填充变量声明、函数声明、函数形参的属性。在解析前阶段创建的执行上下文包括:变量对象、作用域链、this变量对象(VariableObject):由vardeclaration、functiondeclaration(变量声明、函数声明)、arguments(参数)组成。变量对象作为单例存在。作用域链(ScopeChain):变量对象+所有父作用域(变量对象和所有父作用域)。this值:(thisValue):contentobject。this的值是在进入上下文阶段时确定的。一旦进入执行代码阶段,this的值就不会改变。6.2.2执行注意:括号()是一个运算符,后面是函数名,表示函数被调用。函数名()或参数名.call()js运行三部曲1、语法分析2、预编译3、预编译的解释与执行1、创建AO对象(执行者上下文、执行环境)2、寻找形参和变量声明,使用变量和形参作为AO的属性名。值为undefined3,统一实参值和形参值4,在函数体中找到函数声明,给函数体赋值注意:变量对象初始化顺序:函数参数-->函数声明-->变量宣言;(也是提升顺序)[[Scope]]仅针对js引擎运行scope\scopechainfunctionfn(){//创建Ao对象(ActivationObject)执行者上下文//伪代码varAO={this:window,//构造函数-related'[[Scope]]':'GO',//链接的范围*/num:undefined,};varnum=123;}fn();//全局作用域varGO={this:window,window:(Object),document:(Object),fn:undefined}[object]literal(constructor(普通函数(预编译)))andInternalprincipleofliteralconstructor[instance,constructor,object]原型链的连接点:__proto__call/apply:把this改成指向call/apply区别:不同的参数列表//模拟构造函数(构造函数原理)functionObject(){//1.在函数体前面加上this={}//2.执行this.xxx=xxx;//3.隐式返回this(引用类型)varthis={__proto__:Object.prototype,//可修饰contructor:Object,//constructorarguments:null//形参https://zhuanlan.zhihu.com/p/72469390};this.name='zhangcs';归还这个;}//原型Object.prototype={name:'prototype'}//实例newObject().name;//指向属性'zhangcs'newObject().contructor;//指向构造函数newObject().__proto__;//指向原型//将其更改为指向varobj={}Object.call(obj,'parameter');//this=objObject.apply(obj,['parameter']);//参数必须是一个数组Style.apply(this,[color]);};varcar=newCar('red','200')7.任务队列JavaScript语言的一大特点是单线程,即Say,only一次可以做一件事那么为什么JavaScript不能有多个线程呢?这样可以提高效率啊。JavaScript的单线程与其用途有关。作为一种浏览器脚本语言,JavaScript的主要目的是与用户交互和操作DOM。这就决定了它只能是单线程的,否则会带来非常复杂的同步问题。例如,假设JavaScript同时有两个线程,一个线程向某个DOM节点添加内容,另一个线程删除这个节点,浏览器应该以哪个线程为基础?单线程意味着所有的任务都需要排队,下一个任务只有在上一个任务完成后才会执行。如果前一个任务耗时很长,后一个任务就得一直等下去。