码迷,mamicode.com
首页 > 其他好文 > 详细

闭包的含义

时间:2019-12-22 20:11:48      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:含义   word   tps   就是   fun   asc   数据   set   nbsp   

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

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 了最后一个,那就产生了内存泄漏。

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

 

出处:https://segmentfault.com/q/1010000016554258/a-1020000016557945

闭包的含义

标签:含义   word   tps   就是   fun   asc   数据   set   nbsp   

原文地址:https://www.cnblogs.com/Alon-Td/p/12080575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!