闭包的含义
Posted alon-td
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包的含义相关的知识,希望对你有一定的参考价值。
闭包其实就是函数对上级作用域中变量的捕获,函数在,闭包在,函数没人引用了,闭包也就随之被销毁。
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
以上是关于闭包的含义的主要内容,如果未能解决你的问题,请参考以下文章
在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途