JS中V8底层运行机制之执行上下文及堆栈内存安排,内含大厂面试题,拿来把你~

639 阅读3分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

特殊的节日,也要继续更文呀,祝大家七夕快乐哦作为一个成熟的程序员,分分钟new一个对象
大家好,我是圈圈,热爱前端,喜欢分享,很感谢这个活动,我希望我可以坚持,感谢你那么好看,还看了我的文章,欢迎大家评论区交流切磋~

JS代码运行在浏览器中

ECStack(Execute Context Stack)执行环境[栈内存]

【栈内存】的作用

  • 作用1:供代码执行
  • 作用2:存储原始值和变量

EC(G)(Execution Context Global) 全局执行上下文

  • 目的:区分代码执行的环境
  • 全局代码都会在全局上下文中执行 VO(G)(Variable Object Global) 全局变量对象
  • 存储当前上下文中声明的变量的
  • 计算机当中的内存 ram rom 
  • 内存:栈内存Stack、堆内存Heap
  • 内存条中分配出来的运行内存 [CPU]
  • 前端性能优化:内存优化

等号=赋值的操作

1.创建一个值(原始值&对象)
  • 原始值:在栈内存中找个位置存储起来
  • 对象:单独开辟一个堆内存空间;用来存储对象中的成员等信息
2.声明变量 declare,把声明的变量存储到当前上下文的“变量对象VO/AO”

  var/function/let/const/import....

3.让变量和创建的值关联在一起 Defined 定义

图片.png

对象类型[非函数]赋值操作
  1. 开辟一个堆内存空间[在堆内存中开辟一个单独的空间] ->会产生一个共访问的地址【16进制】
  2. 把对象中的键值对一次存储到空间中
  3. 把空间地址放到栈中存储,以此来供变量的引用

window全局对象

VO(G) 全局变量对象:存储全局上下文中声明的变量

图片.png

JS中运算符优先级 developer.mozilla.org/zh-CN/docs/…

详细解读函数的底层执行机制

大厂面试题知多少~

// 思考1

var a = {n1}; //->堆内存 0x000
var b = a;
a.x = a = { n:2}
console.log(a.x)  //undefined
console.log(b)    //

图片.png

// 思考2
var x = [1223];
function fn(y) {
    y[0] = 100;
    y = [100];
    y[1] = 200;
    console.log(y); //[100,200]
}
fn(x);
console.log(x); // [100,23]

创建函数:

  1. 开辟一个堆内存【在堆中开辟一个空间】,有一个16进制的地址
  2. 存储的内容
  3.   函数体中的代码当作字符串先存起来
  4.    当作普通对象也会存一些键值对
  5. 创建函数的时候,就声明了其作用域【scope】【创建函数所在的上下文】
  6. 把堆内存的地址放在栈中,供函数名(变量)去调用 fn函数执行 -> 把函数体中存储的代码字符串当做代码去执行、 fn(0x000) 形成一个全新的“私有的”执行上下文 EC(FN) [进栈执行]

图片.png AO(Active Object)(FN)私有的变量对象 AO也是变量对象,他是VO的一个子集 函数中的叫AO,全局的是VO,块级上下文中的也是VO 执行函数

1.形成一个私有的执行上下文EC(...),然后进栈执行

    AO(...)

函数执行之前要做的事
  1. 初始化作用域链 SCOPE-CHAN  <EC(FN),EC(G)> 左侧:自己私有上下文 右侧:函数作用域
  2. 目的:后期函数上下文中代码执行,遇到变量,首先看是否为自己私有的,
  3.  如果不是私有的,则按照作用域链,找其上级上下文...(作用域链机制)
  4. 初始化this指向
  5. 初始化arguments[实参集合]
  6. 形参赋值 【形参是私有变量,会在i所有变量对象中存储】 7.变量提升 8.代码执行

图片.png 前端路漫漫其修远兮,吾将上下而求索,一起加油,学习前端吧

欢迎留言讨论~