- 什么是闭包
函数嵌套函数,内部函数可以引用外部函数的参数或者变量,外部函数不能引用内部函数的参数或者变量
function aaa(a) {
var a = 5;
function bbb() {
alert(a);
}
return bbb;
}
var c = aaa ();
c();
垃圾回收机制
函数中的变量在函数调用完后,会被垃圾回收机制收回。在闭包中,变量会被内层函数引用,所以不会收回。所以长期驻扎在内存中。
闭包的好处
- 希望一个变量长期驻扎在内存中
- 避免全局变量的污染
var aaa = (function() {
var a = 1;
return function() {
a++;
alert(a)
}
})();
aaa();//2
aaa();//3
- 闭包的应用
1.内部函数私有化(模块化)
var aaa = (function() {
var a = 1;
function bbb() {
a++;
alert(a);
}
function ccc() {
a++;
alert(a)
}
return {
b:bbb,
c:ccc
}
})()
aaa.b();
aaa.c();
- 内存泄露
IE下会引发内存泄露,当发生内存泄露的时候,页面跳转时,变量不会被释放。只有关闭浏览器后才能释放。
变量由获取dom节点或者数组对象创建,js对象属性引用内部,内部又引用外部的对象时,互相引用就会引发内存泄露。
<div id='box'>aaa</div>
<script>
window.onload = function(){
var oBox = document.getElementById('box');
oBox.onclick = function() {
alert(oBox.id);
}
}
/*方法一*/
window.onunload = function(){
oBox.onclick = null;
}
/*方法二*/
oBox = null
</script>