闭包简介:
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。
闭包的特性:
1.函数内再嵌套函数
2.内部函数可以引用外层的参数和变量
3.参数和变量不会被垃圾回收机制回收
闭包有什么作用:
如下例:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
又例如:给li添加点击事件,能正确输出li的索引
<section>
<ul>
<li>111</li>
<li>222</li>
<li>333</li>
</ul>
</section>
<script type="text/javascript">
var nodes = document.getElementsByTagName("li");
for(let i = 0;i<nodes.length;i+= 1){
(function(i){//现在包装了一层之后,i 被传递到内层的匿名函数 local 作用域中去,所以3次循环都会建立独立的 i
nodes[i].onclick = function(){
console.log(i+1);
};
})(i);
/* nodes[i].onclick = function(i){//这个也不行,能正确输出,但是事件不能点击
console.log(i+1);
}(i);*/
/*nodes[i].onclick = function(){//不用闭包的话,值每次都是4
console.log(i+1);
};*/
}
</script>
闭包的缺点:
闭包可以在函数外部改变函数中的变量的值,如果你把函数作为对象、闭包作为方法、局部变量作为私有属性使用,则会改变该变量的值;
闭包还会把函数中的变量的值存储于内存中,对内存消耗很大,所以滥用闭包的结果就是影响网页性能,IE中则可能导致内存泄露;