美文网首页
执行上下文、调用栈、块级作用域、垃圾回收

执行上下文、调用栈、块级作用域、垃圾回收

作者: 李霖弢 | 来源:发表于2021-03-16 13:48 被阅读0次

执行上下文

一段JS代码在执行之前需要被JavaScript引擎编译。 在编译阶段,变量和函数会被存放到执行上下文中(变量提升),变量的默认值会被设置为undefined。在代码执行阶段,JavaScript引擎会从执行上下文中去查找自定义的变量和函数。

三种创建上下文的场景
  • 当JavaScript执行全局代码的时候,会编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局执行上下文只有一份。
  • 当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束之后,创建的函数执行上下文会被销毁。
  • 当使用eval函数的时候,eval内的代码也会被编译,并创建执行上下文。

内存结构

原始类型的数据值都是直接保存在中的,引用类型的值是存放在中的,防止栈空间内容过多影响上下文切换效率

赋值时,原始类型的赋值会完整复制变量值,而引用类型的赋值是复制引用地址。即上图中d=c指令只是把1003赋值给了d,让d和c指向同一对象

  • 通过 Chrome开发者工具=>Memory=>take snapshot 可以查看当前内存堆栈情况
调用栈

JS引擎通过栈管理执行上下文。每当一个上下文被创建,都会被压入栈中。如下脚本中会依次入栈,然后在执行中依次出栈。

var a = 2
function add(b,c){
  return b+c
}
function addAll(b,c){
var d = 10
result = add(b,c)
return  a+result+d
}
addAll(3,6)

通过console.trace()或Chrome开发者工具中打断点后的Call Stack按钮可以查看函数调用关系。

栈溢出(Stack Overflow)

调用栈是有大小的,当无限递归递归次数过大时就会溢出。可以通过循环代替递归的方式解决因递归次数过大时引起的溢出。


垃圾回收

栈回收

栈中的数据随脚本执行,无效内存会被覆盖


堆回收

堆中的数据分为新生区和老生区,两者具有不同的回收策略

  • 新生区中存放生存时间短、占用空间小的对象
    新生区通常只支持 1~8M 的容量
    新生区中经过两次回收依然存活的对象,会被移动到老生区
  • 老生区中存放生存时间久、占用空间大的对象
全停顿

触发垃圾回收时JS线程会被暂停,通常V8通过增量标记(Incremental Marking)算法将一个完整的回收拆分成多个子任务穿插在其他JS任务中执行,避免卡顿。


块级作用域

通过letconst支持块级作用域,以解决变量提升存在的变量覆盖、变量污染等设计缺陷。
作用块内声明的变量不影响块外面的变量。

let x = 1;
{
  let x = 2;  // 不同的变量
  console.log(x);  // 2
}
console.log(x);  // 1
  • 暂时性死区
    可以认为let/const也存在变量提升,但提升后在赋值前不可被访问,称为暂时性死区,此时访问会导致报错。
{
  console.log(myname)//Uncaught ReferenceError: Cannot access 'myname' before initialization
  let myname= '极客邦'
};

相关文章

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • 执行上下文、调用栈、块级作用域、垃圾回收

    执行上下文 一段JS代码在执行之前需要被JavaScript引擎编译。 在编译阶段,变量和函数会被存放到执行上下文...

  • 变量函数提升与执行上下文

    变量与函数提升 作用域与执行上下文的区别 执行上下文 执行上下文栈 作用域 作用域链

  • 一个例子 - 看尽javascript执行过程

    本文涵盖的知识点: 执行上下文和执行上下文栈,作用域和作用域链,变量对象,活动对象,this, apply, ca...

  • 2. 执行上下文

    执行上下文即为形成一个作用域的代码执行环境。 JavaScript引擎会以函数调用栈的方式来处理它们,栈底永远都是...

  • 3-1 作用域和闭包 执行上下文

    3-1 作用域和闭包 执行上下文 知识点 执行上下文 this 作用域 作用域链 闭包 执行上下文 先执行后定义

  • 闭包

    通过一些题目来理解闭包。 涉及知识点:1.执行上下文2.作用域链3.this指针4.垃圾回收机制:标记回收 例子1...

  • 前端程序员面试你应该懂的原生JS——2

    1. 谈谈你对JS执行上下文栈和作用域链的理解。 执行上下文就是当前 JavaScript 代码被解析和执行时所在...

  • JavaScript_05作用域链

    作用域链(Scope chain)。 在《JavaScript_03执行上下文栈》中讲到,当 JavaScript...

  • 1. let , const 块级作用域

    作用域全局作用域 => global函数作用域 => 因函数执行而产生的作用域 块级作用域形式 : { }特点 :...

网友评论

      本文标题:执行上下文、调用栈、块级作用域、垃圾回收

      本文链接:https://www.haomeiwen.com/subject/rspkcltx.html