浅谈JS引擎和JS内存(图解)

823 阅读2分钟

从chrome的进程说起

当你双击chrome快捷方式打开chrome,计算机就多了一个chrome的进程,chrome进程,会分多个子进程,包括:

  • 扩展应用程序子进程,
  • GPU子进程
  • new Tab的子进程
  • ...

在new Tab的子进程中会有多个线程,线程是比进程更轻量级的一个概念,包括:

  • 渲染引擎
  • JS引擎
  • 用户界面
  • 存储

我们可以了解到,JavaScript其实是单线程执行的,那我们怎么进行DOM操作呢,只能进行跨线程通信,让JS引擎通知,渲染引擎,元素的改变,所以业界常说的,DOM操作慢,就是因为DOM操作需要跨进程。

可以看图:

在这里插入图片描述

浏览器的功能(面试常考)

  • 发起请求,下载HTML,解析HTML,下载CSS,解析CSS,渲染界面,下载JS,解析JS,执行JS
  • 功能模块:用户界面,渲染引擎,JS引擎,存储
  • 功能模块一般处于不同的线程

JS引擎

各大浏览器用的JS引擎

chrome用的V8引擎,c++编写

网景用的是SpiderMonkey,后被Firefox使用,c++编写

Safari用的是JavaScriptCore

IE用的是Chakra(JScript9)

Edeg用的是Chakra(JavaScript)

JS引擎的功能

  • 编译:把JS代码翻译为机器能执行的字节码或机器码
  • 优化:优化字节码和机器码
  • 执行:执行上面的字节码和机器码
  • 垃圾回收:把JS内存用完再回收

JS为我们准备了什么环境?

提供了API:window/document/setTimeout,这些都是JS只身具备的功能,我们称这些功能称为运行环境(runtime env)

那么我们的JS代码放在哪了?

JS代码放到了内存了里面

在这里插入图片描述

unknowed 区存放变量

Stack区特点:每个数据顺序存放

Heap区的特点:每个数据随机存放

var a=1;

var b=a;

var person={name:'zhangsan',child:{name:'jack'}};

var person2=person;

问下面代码是如何存放的

在这里插入图片描述

这就可以解释为什么

person2.name="gebilaowang"

person.name会变成"gebilaowang"

JS世界是怎么样的

window浏览器提供

console

document

Object

Array(一种特殊的对象)

Fucntion(一种特殊是对象)

全部挂在Windonw上

挂在window上都可以直接使用

在这里插入图片描述

把Window在内存图中表示

在这里插入图片描述

原型

什么是原型?

保存了它的地址,即引用/指向

对象的一个特殊属性

它使得所有的实例对象,都共享有它的属性

可以解释为什么

var obj={}
obj.toSting()

obj明明为空,并且没有任何属性

但它却能调用toString属性,原因是obj种有一个隐藏属性,它的名字是__proto__,里面有toString方法

在这里插入图片描述

在这里插入图片描述