V8底层运行机制之执行上下文及堆栈内存

407 阅读2分钟

js代码运行的环境

浏览器 ->webkit(v8)、Trident(IE)、Gecko(火狐)、Blink(谷歌)
Node->webkit
webview(Hybrid混合app开发)->webkit内核

内存

栈内存Stack 堆内存Heap
+ 内存条中分配出来的运行内存 (CPU)
+ 前端性能优化:内存优化
============================================
ECStack->执行环境栈(栈内存)
+可供代码执行
+存储原始值&变量
EC(G)全局执行上下文
+目的:区分代码执行的环境
+全局代码都会在全局上下文中执行
VO(G)全局变量对象(在栈中):存储全局上下文中声明的变量
+存储全局当前上下文中声明的变量的
+可以在任一一个上下文中访问到
GO全局对象(在堆中):存储浏览器中内置的api
AO(G)私有的变量对象:他是VO的一个子集
+只能在私有的上下文中访问
=====================================================
=赋值的操作
1.创建一个值(原始值类型&对象类型)
+原始值:在栈内存中找个位置存储起来
+对象:开辟一个对内存空间用来存储对象中的成员等信息
2.声明变量Declare,把声明的变量存储到当前上下文的“变量对象中VO/AO”
var/function/let/const/import...
3.让变量和创建的值关联在一起Defined 定义

js代码是怎么在浏览器中运行的

浏览器想要执行代码首先在内存中开辟出一部分内存供代码执行,这一部分内存叫栈内存(ECStack)就是ECStack(可供代码执行的环境栈)

创建函数:目的是为了把函数中存储的代码字符串当做代码去执行形成一个全新的“私有的”执行上下文 EC(FN)(进栈执行)

1,开辟一个堆内存(在对内存中开辟一个空间),有一个16进制的地址
2,存储的内容
+函数体中的代码当做字符串先存起来
+当做普通对象也会存一些键值对
3,创建函数的时候,声明了其作用域[[scope]],创建函数所在的上下文
4,把堆内存的地址放置在栈中,供函数名(变量)去调用

执行函数:

1,形成一个私有的执行上下文EC(...)然后进栈执行
+AO(...)
2,初始化作用域链
3,初始化This
4,初始化ARGUMENTS实参集合
5,形参赋值(形参是私有变量&当前私有上下文中声明的变量也是私有变量)
6,变量提升
7,代码执行
8,根据情况,决定当前形成的私有上下文是否会出站释放(一般都会出栈释放)
-----------

函数再次执行,所有的操作重新走一遍(所以函数执行多次,每一次执行之间是没有直接关系的)