图文并茂之代码的执行内存分析

1,689 阅读2分钟
var msg = 'hello world'
  • 在堆内存中创建全局对象GO(global object),并分配一个内存地址(0xa00

image.png

  • 在栈内存中创建全局上下文,每个上下文中有个VO,全局上下文中的VO指向GO image.png
  • 解析代码,词法分析,变量的声明,此时未给变量赋值,或者说是赋值了undefined image.png
  • 执行代码,给变量赋值 image.png
function foo(){}
  • 在堆内存中创建全局对象GO(global object),图同上,此处略。
  • 在栈内存中创建全局上下文,图同上,此处略。
  • 解析代码,词法分析,函数foo的声明,在堆内存中分配一块内存给foo函数对象使用,foo的值为指向函数对象的地址(即0x100),同时函数对象中保存着父级对象的地址(即0xa00) image.png
function foo(){
    var info = 'foo'
    console.log(msg)
}
foo()
var msg = 'hello world'
  • 在堆内存中创建全局对象GO(global object)
  • 在栈内存中创建全局上下文
  • 解析代码,词法分析,声明变量msg初始值为undefinedfoo是函数则为其分配内存并保存内存地址,foo函数对象中保存有父级对象的地址 image.png
  • 执行代码,foo(),先创建函数执行上下文和AO(activation object)对象 image.png
  • 解析完代码,创建完AO对象后,再继续执行,info变量的赋值,msg的打印输出,此时msg先从自己的AO对象中查找,没找到,则根据作用域链(scope chain),沿着其作用域链继续查找,直到找到或到最顶层为止。此处找到了,值为undefined,进行打印输出。 image.png
  • 代码继续执行,此时函数foo执行完毕,foo的函数执行上下文从栈中弹出,所在堆中生成的AO对象也被删除。即回收不被引用的内存。设置msg的值为hello world

垃圾回收算法:引用计数、标记清除 image.png

  • 此时代码全部执行完毕,如上图,foo引用着一块内存,所以不会被看做成垃圾进行回收,如果设置foo = null,则该块内存会被回收 image.png