浏览器-JS运行机制

2022-02-28  本文已影响0人  Napster99

一、浏览器内核类型

内核(渲染引擎) JS引擎
Chrome webkit -> blink v8
Firefox Gecko SpiderMonkey(1.0-3.0) / TraceMonkey(3.5-3.6) / JaegerMonkey(4.0-)
Safari webkit Nitro(4-)
Opera Presto -> blink Linear A(4.0-6.1)/ Linear B(7.0-9.2)/ Futhark(9.5-10.2)/ Carakan(10.5-)
IE/Edge trident -> EdgeHTML JScript(IE3.0-IE8.0 / Chakra(IE9+之后)

渲染引擎:解析HTML/CSS进行页面渲染
JS引擎:用来解释执行js代码,早期内核包含js引擎,目前基本独立

二、浏览器进程

背景:JS之父Brendan Eich在1995年在Netscape公司就职时,为了快速满足浏览器上运行的客户端脚本语言,将Mocha设计为单线程运行脚本,当时为了趁Java语言的热度,将Mocha命名成JavaScript,其中单线程运行机制一直沿用至今。浏览器需要展示大量网页应用,一般用C++编写可以支持多进程。

浏览器进程&线程
从图上可以一目了然的看到,浏览会有四大进程,分别是主进程/插件进程/GPU进程/渲染进程,其余还有NetworkService、AudioService、StorageService等;

三、网页解析流程

一张网页是如何展示到页面上的,其中经过哪些环节,大致环节如图表示:

网页执行流程示意图
从图上可以看出,整个流程大致分为三大块去执行

至此我们对网页的加载显示有了大致的了解。

四、JS编译到执行

都说JS是解释型动态语言,边解释边执行,不需要类似java一样先通过javac将源程序编译成.class文件,字节码,再将字节码转为机器码。那解析来具体看下整体过程是怎么样的。
首先了解下编译型 & 解释型语言异同点,两者的设计初衷就是为了将高级语言编译成能被机器理解执行的语言,差异就是前者是运行前执行,后者是运行时执行并且需要在环境中安装解释器才能被解析,这部分就是JS引擎要做的工作。

JS解析过程
由图可以看出JS解析过程主要包含两大阶段语法检查阶段运行阶段
// A1 代码片段
var age = 11;
function foo() {
  console.log(age);
}
foo(); 
// A2 代码片段
var age = 11;
function foo() {
  console.log(age);
  var age = 22;
  console.log(age);
}
foo(); 

这里不得不提编程语言都会用到的两大作用域

词法作用域--类似javascript、java、c/c++、python、c# ...
动态作用域--类似Lisp、Perl

词法作用域(静态作用域),在创建阶段,会确定词法环境,当前词法环境会指向父级词法环境,直至null,是一种链表结构,类似原型链。

词法环境创建阶段

基于A1&A2代码片段的图中可以看出,创建阶段主要包含以上的三块内容,参数、变量、函数声明分别在全局和函数内部定义了age、foo同时被赋值成undefined,至此词法分析阶段结束。

执行阶段
上一篇下一篇

猜你喜欢

热点阅读