什么是闭包?
闭包在实现上是一个结构体 ,它存储了一个函数和一个关联的环境
从广义的角度来说:JavaScript中的函数都是闭包
从狭义的角度来说:JavaScript中一个函数,如果访问了外层作用域的变量,那么它是一个闭包
如下一定形成了闭包:
function makeAdder(count){ return function(num){ return count+num }}var add10=makeAdder(10)console.log(add10(5))
闭包的内存泄漏
在上面的案例中,如果后续我们不再使用add10 函数了,那么该函数对象应该要被销毁掉,并且其引用着的父作用域AO也应该被销毁掉,但是目前因为在全局作用域下add10 变量对0xb00 的作用域中AO(0x200) 的引用,所以最终会造成这些内存都是无法释放的
如何解决?
当add10 设置为null 时,就不再对函数0xb00 有引用,那么对应的AO对象0x200就不可达了,在GC的下一次检测中它们就会被销毁掉了
更多技术分享,请持续关注云和数据!
闭包在实现上是一个结构体 ,它存储了一个函数和一个关联的环境
从广义的角度来说:JavaScript中的函数都是闭包
从狭义的角度来说:JavaScript中一个函数,如果访问了外层作用域的变量,那么它是一个闭包
如下一定形成了闭包:
function makeAdder(count){ return function(num){ return count+num }}var add10=makeAdder(10)console.log(add10(5))
闭包的内存泄漏
在上面的案例中,如果后续我们不再使用add10 函数了,那么该函数对象应该要被销毁掉,并且其引用着的父作用域AO也应该被销毁掉,但是目前因为在全局作用域下add10 变量对0xb00 的作用域中AO(0x200) 的引用,所以最终会造成这些内存都是无法释放的
如何解决?
当add10 设置为null 时,就不再对函数0xb00 有引用,那么对应的AO对象0x200就不可达了,在GC的下一次检测中它们就会被销毁掉了
更多技术分享,请持续关注云和数据!