闭包是什么时候销毁的呢?

请问闭包是什么时候销毁的呢?会不会造成内存泄漏呢?
网上关于闭包是否会造成内存泄漏有很多种说法,有没有哪位大神能解答一下呀~

阅读 10.9k
2 个回答

闭包其实就是函数对上级作用域中变量的捕获,函数在,闭包在,函数没人引用了,闭包也就随之被销毁。

function test() {
  var data = new Array(100000); 
  var getData = function(){return data;};
  setTimeout(getData, 10000);
}

一般来说,在函数内创建的局部变量,在函数运行结束后,是会被自动销毁的. 例子中每运行一次 test 函数,就会创建一次 data 数据,如果 getData 没有引用上层作用域的 data 变量,data 在 test 函数运行结束后,便会被销毁。getData 在创建的时候,就会随之创建一个特殊的容器,用于保存上层作用域中变量的引用。可以这么说,getData 函数创建的闭包捕获了外部的 data 变量的引用。按理说,getData 这个变量在 test 函数运行结束后,也是会被销毁的。事实也的确如此,如果没有后面的 setTimeout 的话。正因为 setTimeout 一直拿着 getData 这个函数的引用,而 getData 形成的闭包又捕获了 data 变量的引用,因此 data 数据会一直存在,并不会在 test 函数结束之后立马销毁。setTimeout 在 10s 之后会运行 getData 指向的函数,然后会释放掉函数引用,也就是说 10s 后没有变量再引用 getData 指向的函数了,那么 getData 形成的闭包也可以得到销毁,捕获的上层变量也一并得到了释放。所以例子中,getData形成的闭包是在 10s 后被销毁的。

那为什么会有内存泄漏呢?

试想如果例子中你使用的不是 setTimeout 而是 setInterval, 那么,getData 这个函数一直在 setInterval 中被引用着,getData 形成的闭包以及闭包所捕获的变量都会一直存在,直到你 clearInterval。如果你忘记 clear 了,或者你 错误地起了多个定时器但是并不知道只 clear 了最后一个,那就产生了内存泄漏。

总之,只要没人再保存这个函数的引用了,这个函数和函数所形成的闭包也就会被一并销毁。

首先需要正确理解什么是闭包,通俗的来讲闭包是函数套函数,但不一定满足函数套函数就是闭包,所以在长期的总结过程中又有了另一种说法,一级函数调用二级函数, 二级函数访问一级函数词法作用域变量的过程叫做闭包,闭包会造成内存泄漏一直是闭包的一个弊端,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题