哪些会导致内存泄漏
- 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的内存即可回收
- setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
- 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
怎么解决闭包内存泄漏?
- 在定时器不被使用的时候及时清除定时器
- 在变量不被使用的时候及时的赋值为null
怎么在闭包外边读取到闭包里的值
- 将闭包的参数作为参数传递给一个函数,然后在函数内部返回闭包的值。这样,你可以在闭包外部读取到闭包内的值。
- 使用事件处理程序和回调函数,这样可以避免使用闭包。这些函数不会占用额外的内存,因为它们只是将事件传递给其他函数。
- 使用闭包的上下文对象(let 声明的变量在闭包内是安全的),这样你可以在闭包外部访问这些变量。