JS内存管理和闭包
1.JS内存管理
2.垃圾回收机制
常见的GC算法
引用计数(Reference Counting)
当有一个对象引用指向它时,那么这个对象就+1
当一个对象的引用为0时,这个对象就被销毁掉了
ex: 循环引用
1
2
3
4
5
6
7
8
9obj1 = {}
obj2 = {}
obj1.info = obj2
obj2.info = obj1
// 此时obj1和obj2的引用计数都为2
obj1 = null
obj2 = null
// 此时obj1和obj2的引用计数都为1,不为0,不会被销毁掉,需要我们手动销毁标记清除(Mark-Sweep)
标记清除的核心思想就是可达性(Reachability)
描述: 这个算法是设置一个根对象(Root Object/window/Global Object,在不同地方有不同的叫法,但是i都是指的同一个对象),垃圾回收器会定期从这个根开始,找所有从这个根开始有引用到的对象,对于那么没有引用到的对象,就认为是不可用对象。
这个算法能很好的解决循环引用的问题
ex:
1
2
3
4
5
6
7
8
9
10var RootObject = {
obj: {
foo: function a() {},
bar: function b() {}
}
}
RootObject -> obj -> foo/bar
foo -> function
bar -> function其他算法优化补充
标记整理
分代收集
增量收集
闲时收集
3.闭包
3.1概念
闭包的定义
闭包(Closure):又称词法闭包或函数闭包。
闭包在实现上是一个结构体,他储存了一个函数和一个关联的环境。
闭包和函数最大的区别在于,当捕获闭包的时候,它的自由变量会在被捕获时确定,这样即使脱离了捕获时的上下文,也可以正常运行。
理解和总结
- 一个普通的函数,如果它可以访问外层作用域的自由变量,那么这个函数和周围环境就形成了闭包
- 从广义的角度来看:JS中的函数都是闭包。
- 从狭义的角度来看:JS中的一个函数如果访问了外层作用域的变量,那么它就是一个闭包。