闭包
- 在闭包中,内部函数引用外部函数变量,实际上是应用了外部函数的作用域(scope)对象
- 如果作用域对象所在函数还是一个闭包,将形成一个很长的引用链,占用大量内存
- 其中有很大一部分内存的占用是不必要的,因为除了闭包以外没有其他引用指向链条中的绝大部分对象
- 所以在程序里尽量减少使用闭包,使用完毕要手动释放闭包函数对象
全局变量
- 在javascript中定义全局变量,实际上是以全局对象的属性保存的
- 而全局对象永远不会被gc,如果大量定义全局变量则会造成内存泄漏
dom事件绑定
- 在获取dom为其绑定事件监听以后,如果后续从页面上移除了此dom则会造成内存泄漏
- 是由于事件监听回调函数与dom对象的循环引用导致的两者在dom被移除后都无法被正常gc
- 在事件回调函数中如果没有引用dom对象则不会造成循环引用
- 但是通常情况下我们在回调函数中都会用到dom对象,即使没有显式的使用
- 如果我们引用了event对象,由于event对象中有对dom的引用,隐式的造成了循环引用
- 通常可以通过在移除dom前解除事件监听,但是dom可能绑定多个事件监听
- 因此更好的做法是在移除dom后,手动的释放引用dom的变量
网友评论