垃圾回收机制
- 全局变量只有标签页关闭才会回收
- 局部变量用完就回收
标准浏览器使用的是标记回收,旧的IE使用的是引用回收,如果两个变量相互引用,这两个变量就一直不会被回收
闭包
var a = 10;
document.onclick = function(){
console.log( ++a );
}
/*a是全局变量,所以函数里的a可以一直加*/
//闭包
(function(){
var a = 10;
document.onclick = function(){
console.log( ++a );//使用的是外部函数的a
}
})();
//产生了闭包,此时a为局部变量,但不会被回收
/*
闭包产生的条件:
1. 外部函数 嵌套 内部函数
2. 内部函数使用了外部函数的参数或变量
称这个内部函数为闭包
闭包产生的影响:
被引用的 参数/变量 不会被回收
*/
闭包使用的情况
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
无法得到序号
var aP = document.getElementsByTagName("P");
for( var i=0;i<aP.length;i++){
aP[i].onclick = function(){
console.log(i);//无法得到序号,无论点哪个得到的都是循环结束后的值--4
}
}
使用闭包
var aP = document.getElementsByTagName("P");
for( var i=0;i<aP.length;i++){//a
(function(i){//c
aP[i].onclick = function(){//d
console.log(i);//e
};
})(i);//b
}
//ab处的i是同一个i cde处的i是同一个i
//ES6使用let,作用与闭包相同
var aP = document.getElementsByTagName("P");
for( let i=0;i<aP.length;i++){
aP[i].onclick = function(){
console.log(i);
}
}