补充:V8执行的过程(形象版)

0 阅读1分钟

*在我的前几篇文章中,有提到过v8是如何执行指令的,感兴趣可以去看看

首先,咱们先引入一串代码

var obj={
          name:'小明',
          age:'18',
          like:{
                one:'eat',
                two:{game:['LOL'],
                     sports:[ 'run']
              },


}

咱们来分析一下代码,这个代码就是简单介绍了一下小明,他的各种兴趣爱好什么的,那么让我们来看看v8引擎中的小明是怎么处理这段消息的

创建一个调用栈,用来存放和编译的过程。咱们拿一个图来进行解释说明

75cae2be97af9ce455e4c054f39a404.jpg

(在代码执行过程中,v8对不同的数据的处理方式也不一样:

  1. 对于原始类型的值,会直接存储到调用栈当中,因为原始值的大小固定且容易访问
  2. 对于复杂类型的值,由于他们的大小不定,甚至有的大小可以突破天际,所以v8会另外分配一个空间,叫做“”,然后通过引用地址(也就是我们俗称的指针)来对复杂类型的值进行说明

用“堆”来辅助调用栈的好处就是:保证了栈不会被设计的很大从而影响v8的执行效率,且不会爆栈)

接下来,把这些值存入执行上下文,执行代码,将原始值 存入调用栈中,如果遇到引用类型的值,则放入堆中,并生成一个引用地址,将引用地址存入栈中

接下来,那些代码就被执行成这样

89c271ed719af09f35e71fa1577aefc.png

这样,v8引擎就能一眼调用出想要用的数据了,大大提高了运行的效率