JavaScript之闭包
“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)—-百度百科
javascript
对于javascript,闭包通俗来说也就是声明的变量,在函数执行完成的时候,由于被其他变量所引用,而导致声明的变量不能被垃圾回收系统回收掉,一直保存在内存中。
举个李子
<script>
//这个函数应该属于全局作用域 window
function addOne(){
//在函数内声明一个变量
var temp = 1;
//没有用var 修饰,说明属于window全局作用域
bb = function(){
temp +=1;
alert(temp);
}
return function()
{
temp+=1;
alert(temp);
}
}
//执行声明的函数,将返回值赋给了obj,同时为window添加bb函数 ,不然下面执行bb()会提示bb未定义
var obj = addOne();
obj();
obj();
bb();
bb();
</script>
结果
2
3
4
5这个结果说明了,temp这个变量在执行完addOne这个函数之后,并没有被垃圾回收机制所回收。而是一直保持在内存中,当你每一次调用obj()和bb()时都会在其原有的值上加1。
为何temp没有被垃圾回收
为什么没有被垃圾回收,是因为addOne()内返回了一个函数,这个函数拥有temp的引用,而这个函数又赋给了,属于window全局域的obj变量。所有在你的窗口没关闭之前,temp就一直不会被回收。至于bb,更不用说了,直接声明的全局函数,用于了temp的引用。
引用链window——>obj——>addOne返回的匿名函数—–>temp
注意
请考虑好再使用闭包,因为不会被垃圾回收,而会一直占用内存。