个人对于闭包的理解

文章通过两个示例解释了JavaScript中的闭包概念。第一个例子展示了函数B如何访问并打印函数A的局部变量num,从而形成闭包。第二个例子讨论了在为多个li元素绑定点击事件时遇到的问题,即由于变量i的作用域问题导致的错误输出。通过使用立即执行函数,每个li的点击事件都能正确访问到对应的i值,解决了作用域问题,这里的立即执行函数作为闭包使用。
摘要由CSDN通过智能技术生成

当一个函数可以访问另一个函数内部的变量时,被访问变量的那个函数就为闭包函数。

例子:

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就是正常的值

这里的闭包就是点击事件所触发的函数使用了立即执行函数的数据,所以立即执行函数就是闭包函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值