从内存角度理解JS代码执行过程

下面这段代码是如何执行的呢

js 复制代码
var message = "why"
function foo(){
  var message = "foo"
  console.log(message)
}
var num1 = 20
var num2 = 30
var result = num1 + num2
console.log(result)
foo()

全局代码执行之前

  1. JS 引擎在执行代码之前,先在堆内存中创建一个全局对象 GO 。该对象所有的作用域都可以访问。 在浏览器中这个对象就是 window,里面有 Date Array Number setTimeout等等,还会有一个 window 属性指向自己。
  1. JS 引擎中有一个执行上下文栈,用于执行代码的调用栈,用来执行全局的代码块
  2. 全局的代码块为了执行,会创建一个全局执行上下文,被放入全局执行上下文栈中
  3. 在代码执行之前,代码转换 AST 的过程中 ,会将全局定义的变量、函数加入到全局对象 GO中,这个过程是变量的作用域提升 ,这些变量提升之后,var定义的变量赋值是undefined,函数赋值地址。
  4. 每一个执行上下文会关联一个 VO(变量对象) ,变量和函数声明会被添加到这个 VO 对象中,在全局执行上下文 VO = GO,VO是执行上下文中的概念,GO是堆内存中概念。 在下图中,函数对象中的name是foo,外层作用域就是GO了

全局代码执行之后

  1. 普通变量赋值
  2. foo函数执行
  • 当执行到函数时,会根据函数体创建一个函数执行上下文(FEC)并被压入到全局执行上下文栈中。
  • 并在堆内存中创建AO对象,每一个执行上下文都有 VO 对象,在函数中 VO=AO

函数执行前:

函数执行后:

相关推荐
我命由我1234543 分钟前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
程序员大阳1 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
paopaokaka_luck3 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
栀椩3 小时前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
SEO_juper3 小时前
Chrome 扩展一键查看当前页面 SEO 信息:不用切页面,点一下全出来
前端·javascript·chrome
Highcharts.js3 小时前
CSUN 2026|Highcharts无障碍数据与AI分享
javascript·人工智能·数据分析·highcharts·图表开发
系统集成-鹰翔4 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
小大宇5 小时前
Vue知识点-ElementPlus-05 输入框
前端·javascript·vue.js
外贸GEO优化5 小时前
外贸独立站的可抓取性:JS 渲染、懒加载与无限滚动到底影响什么
开发语言·javascript·ecmascript
web打印社区5 小时前
Lodop在Edge和双核浏览器-先分清内核
前端·javascript·edge·pdf·ecmascript·html5