闭包的概念
利用作用域的嵌套,触发了计算机的垃圾回收机制,将原本的局部变量进化成私有变化的环境 。
闭包的特点
- 解决掉所有的全局变量,节省内存空间;
- 相对于局部变量来说,浪费了内存 ;
- 将局部变量进化成私有变量,在外部可以修改内部的值
闭包形成的三要素
- 在函数A内部有函数B,并返回了函数B 。
- 函数B使用了函数A的局部变量 。
- 执行函数A时,保存函数B,单独执行函数B 。
闭包的应用场景
- 循环中的事件,事件中使用循环每次的计数器 。
var ali = document.querySelectorAll(".list li");
for(var i=0;i<ali.length;i++){
(function(index){
ali[index].onclick = function(){
console.log(index);
}
})(i);
}
或者写成↓↓↓
var ali = document.querySelectorAll(".list li");
for(var i=0;i<ali.length;i++){
ali[index].onclick = (function(index){
return function(){
console.log(index);
}
})(i);
}
- 给系统默认的回调函数传参:计时器的回调函数,传参
function fn(a){
return function(){
console.log(a);
};
}
setTimeout(fn("world"), 1000);
- 处理掉全局变量,只要开启新文件,新功能,最好上手就是一个匿名函数,简易闭包
var f = (function(){
var a = "hello";
function fn(){
console.log(a + "world");
}
return fn;
})();
f();
- 封装过的事件委托,利用到了闭包
obox.onclick = eveEnt(achild,function(){})
function eveEnt(eleArr,cb){
return function(eve){
eleArr
cb
}
}