前端知识点——理解堆栈执行及闭包

本文探讨了JavaScript代码在浏览器、Node等平台上的执行,强调执行环境栈作为内存空间的角色。介绍了执行上下文的概念,用于隔离不同区域的代码。详细阐述了全局执行上下文(EC(G))、变量对象(VO(G))以及全局对象(GO)。讨论了声明和定义、变量提升、堆栈基本值以及函数执行过程,特别是作用域链、this、arguments的初始化和变量提升等关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

笔记内容大多出自于拉勾教育大前端高薪训练营的教程,因此也许会和其他文章雷同较多,请担待。

哪些平台可以执行JS代码

  • 浏览器
  • Node
  • WebView

无论JS代码在哪个平台上执行,最终都需要有一个执行的地方

  • 代码最终都是在内存中运行
  • 在JS执行过程中,浏览器加载界面时会向计算机的内存申请一片空间,用于执行JS代码
  • 这个空间我们称之为执行环境栈(ECS execution context stack)

执行环境栈 -> 本质就是一个内存空间

执行上下文

  • 一段JS代码里有很多内容,比如变量的声明,函数的定义,对象,块作用域
  • 上述这些区域内都有自己的代码,默认情况下他们里面的内容可能会出现重名
  • 所以代码将来在之行时候不可能直接放在一个环境下执行,我们需要进行隔离
  • JS当中就有了执行上下文的概念,专门用于将不同区域的代码隔离开
  • 它也是一个内存空间,我们无需将它具象化,在它里面存放了当前区域代码运行时所需要的数据
var a = 100
function foo() {
  // 此时函数当中的 a 和外部的 a 是互不影响的
  var a = 'aeorus'
}

进栈执行

  • 执行环境栈具有先进后出的特点
  • 每当一段代码要运行时就会生成一个新的执行上下文,然后在这个上下文当中将执行时所需要的内容准备好,之后就开始进栈执行

EC(G) -> execution context global

  • 全局执行上下文,浏览器加载界面的时候就默认创建的一个环境
  • 当前这个上下文如果想出栈,当前页面需要关闭

VO(G) -> variable object global

  • 全局变量对象(全局执行上下文当中的变量需要一个地方来存放,因此有了这个对象)
  • 每一段代码中都有声明和定义,他们放在那儿?
  • 针对全局执行上下文来说,它里面的声明和定义放在了一个对象当中,这个对象我们称之为VO(G)

GO -> global object

  • 全局变量,它和VO(G)不是同一个东西,window属于GO
  • 它也是浏览器加载界面时就会创建的一个对象,在它内部存放了许多JS默认就可以调用的属性和方法(setTimeout setInterval JSON eval…)

声明和定义

  • var obj = {}
  • 声明 -> var obj
  • 定义 -> obj = {}

堆栈基本值

  • 在EC(G)当中有VO(G),用来存储当前执行上下文中的变量声明和定义
  • 代码执行之前会有变量提升,对于var来说只声明不定义,对于function foo() {}既声明又定义
  • 基本数据类型的值是直接存放在栈区
  • 引用类型会放在堆区,并在栈区存放一个16进制的地址便于引用
  • VO(G)当中默认就有一个window,它存放的是一个内存地址,指向GO对象所在的内存

函数执行过程

  • 确定作用域链 scope-chain
  • 确定this
  • 初始化arguments
  • 形参赋值
  • 变量提升
  • 函数代码执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值