web前端高级JavaScript - 闭包的应用及循环事件绑定的N中解决办法

闭包在循环事件绑定中的应用场景描述:在页面上有3个button按钮,当点击每个按钮时输出当前按钮的索引值,要求用循环来绑定每个按钮的事件,看下面的代码。<button>button1</button><button>button2</button><button>button3</button>var buttons = document.querySelectorAll('button');for(var i
摘要由CSDN通过智能技术生成

闭包在循环事件绑定中的应用

  • 场景描述:

在页面上有3个button按钮,当点击每个按钮时输出当前按钮的索引值,要求用循环来绑定每个按钮的事件,看下面的代码。

<button>button1</button>
<button>button2</button>
<button>button3</button>
var buttons = document.querySelectorAll('button');
for(var i = 0; i < buttons.length; i++){
   
	buttons[i].onclick = function(){
   
		console.log(`当前按钮的索引是${
     {
     i}`);
	}
}
  • 原因剖析

上述代码执行完成,发现并不是我们想要的效果,不管点击哪个按钮输出的都是3,而不是我们期望0,/1/2。那么代码看上去并没有问题,输出结果却为什么不是我们期望的呢?

  • 这是因为每次for循环都只是开辟一块堆内存创建一个函数并将函数在堆内存中的地址赋值给每个button对象的属性onclick,这里并没有执行函数。
  • 每循环一次i都会自动加1,直到i=3时循环结束。这时当我们点击某个按钮时才会去执行当前按钮的onclick属性所绑定的函数
  • 函数执行时会形成一个私有上下文(作用域为全局上下文),在这个私有上下文中会用到变量i,但是该上下文中并不存在变量i,于是向上级上下文(也就是全局上下文)中查找,发现有变量i,但此时的i经过三次循环后值已经变成了3(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值