当一个函数可以访问另一个函数内部的变量时,被访问变量的那个函数就为闭包函数。
例子:
function A (){
let num =0;
function B (){
console.log(num)
}
B()
}
A()
// 输出
0
在上面的例子里,函数B调用输出了函数A的变量,满足了闭包的条件,这时函数A即为闭包函数
例子2:给每个li 注册点击事件,并输出每个li的索引
<body>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</body>
<script>
var lis = document.querySelectorAll('li')
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = function () {
console.log(i)
}
}
</script>
希望输出为0,1,2,3。但实际输出为4,4,4,4
解决方法为
for (var i = 0; i < lis.length; i++) {
(function (i) {
lis[i].onclick = function () {
console.log(i)
}
})(i)
}
for循环每次循环都制造一个立即执行函数,并且把当次的i传入立即执行函数,
立即执行函数内部又给li注册点击事件,点击事件输出的i是立即执行函数的实参,这时输出i就是正常的值
这里的闭包就是点击事件所触发的函数使用了立即执行函数的数据,所以立即执行函数就是闭包函数。