JavaScript代码的执行过程、闭包、垃圾回收机制、内存

88 阅读1分钟
var year = '2022'
function foo() {
  var name = "foo"
  var age = 18

  function bar() {
    console.log(name)
    console.log(age)
  }
  return bar
}

var fn = foo()
fn()

初始化全局对象

js引擎会在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO)

  • 该对象在所有的作用域(scope)都可以对其进行访问;

  • 里面会包含Date、Array、String、Number、setTimeout、setInterval等等;

  • 其中还有一个window属性指向自己;

流程图-导出 (3).png

执行上下文栈(调用栈)

image.png

GEC被放入到ECS中解析代码

流程图-导出.jpg

GEC开始执行代码

未命名文件-导出 (1).jpg

遇到函数调用-解析函数

image.png

函数解析-导出.png

遇到函数调用-执行函数

未命名文件-导出 (3).jpg 当FOO函数执行完成之后,调用栈里面的函数执行上下文就会被垃圾回收,但是Foo-Ao对象并不会被回收,那是因为从全局对象GO出发对其进行了引用。

未命名文件-导出.png

遇到函数调用-解析函数-执行函数

未命名文件-导出 (1).png

bar函数执行完成后调用栈里面的函数执行上下文就会被回收,与此同时其对应的AO对象也会被回收,但是FOO对象、FOO函数对应的AO对象、bar对象都不会被回收,那是因为从GO出发有其指引。如果想其被垃圾回收机制回收可以:Foo = null; Fn = null;这样就会被回收。

JS的内存管理

image.png

JS的垃圾回收-标记清除

image.png

image.png

JS中闭包的定义

image.png

闭包的访问过程

image.png

闭包的执行过程

image.png

闭包的内存泄漏

image.png

AO不使用的属性

image.png