一、什么是闭包
概念:闭包还是作用域的一种特殊应用
二、触发闭包的情况
1.函数当做返回值被返回
2.函数当做参数被传递
3.自执行匿名函数
//情况1:函数当做返回值被返回
function fn(){
const a = 1;
return function(){
console.log(a) //1
};
}
const a = 5;
const cb = fn();
cb();
//会在定义的最近的上一层寻找
//情况2:函数当做参数传递
function fn(cb){
const a = 100;
cb()
}
const a = 500;
fn(function(){
console.log(a); //500
});
//在定义的最近的外一层寻找
//情况3:自执行匿名函数
(function(index){
console.log(index); //10
})(10);
三、闭包的应用
1.隐藏变量
2.解决for i 的问题
我们想要实现点击第一个button出现0,点击第二个出现1,依次类推
使用自执行函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>0</button>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
</body>
<script>
const aBtn = document.getElementsByTagName("button")
for(var i = 0; i < aBtn.length;i++){
(function(index){
aBtn[i].onclick = function(){
console.log(index)
}
})(i)
}
</script>
</html>
公司中是这么写的,因为let是块级作用域,每次执行i都会保存起来
const aBtn = document.getElementsByTagName("button")
for(let i = 0; i < aBtn.length;i++){
aBtn[i].onclick = function(){
console.log(i)
}}