闭包
闭包:函数嵌套函数,函数作为参数被传入,函数作为返回值被返回。
闭包作用:创建局部变量;可以封装组件或者插件;函数外部访问函数内部的局部变量。
闭包特点:闭包中的局部变量不会销毁,使用不当容易造成内存泄漏。
闭包举例1:
<script>
//函数作为返回值被返回,形成闭包。
//变量a会常驻内存,不会销毁;并且可以在outer的外部访问a。
function outer(){
var a = 1;
return function(){
a++;
console.log(a);
}
}
var fun = outer();
fun();//函数执行,打印a的值为2
fun();//函数执行,打印a的值为3
</script>
闭包举例2:
<script>
//闭包中的自由变量,是在函数定义时候确定的,不是执行的时候。
//闭包中的自由遍历不会销毁。
var b = 1;
function fun(){
b++;
console.log(b);
}
function outer(callback){
var b = 66;
callback();
}
outer(fun);//函数执行,打印b的值为2
</script>
闭包举例3:
<body>
<ul>
<li>列表1</li>
<li>列表2</li>
<li>列表3</li>
</ul>
<script>
//获取页面节点
var lis = document.querySelectorAll("ul li");
//for(var i=0;i<lis.length;i++){
// lis[i].onclick = function(){
// alert(i);//执行结果是循环结束后i的值。
//}
//我们把上面的错误展示注释掉
//匿名函数自执行,类似函数嵌套函数,也形成了闭包,可以创建局部变量。
for(var i=0;i<lis.length;i++){
(function(j){
lis[j].onclick = function(){
alert(j);//执行结果是每次循环i的值。
}
})(i)
}
</script>
</body>
总结
闭包不好理解,可以多做些练习,执行看结果,对比各种变化,这样有助于理解,与君共勉!