JavaScript中for循环与EventListener的工作机制及按钮点击逻辑解析
代码解析:for循环工作机制与点击事件执行逻辑
下面拆解这段代码里的for循环运行流程,以及按钮点击时的执行逻辑:
一、for循环的工作流程
初始化循环基础值
首先执行var len = document.querySelectorAll(".mybutton").length,这段代码会遍历页面中所有带.mybutton类的按钮,统计出它们的数量——这里是3,所以len的值被设为3。循环迭代过程
循环用let i = 0声明计数器,判断条件为i < len(即i小于3),每次循环结束后执行i++让计数器加1,具体步骤:- 第1次循环(i=0):
执行var doucemnts = document.querySelectorAll("button")[i],获取页面中第0个按钮(也就是第一个按钮),然后给这个按钮绑定点击事件。 - 第2次循环(i=1):
获取页面中第1个按钮(第二个按钮),绑定点击事件。 - 第3次循环(i=2):
获取页面中第2个按钮(第三个按钮),绑定点击事件。 - 当i变成3时,
i < len的条件不成立,循环停止。
重点说明:因为用
let声明i,每个循环迭代里的i都是独立的变量,所以后续点击按钮时,console.log(i)会打印出当前按钮对应的索引值(0、1、2)。如果换成var声明i,所有点击事件都会打印3——这是var的变量提升和函数作用域特性导致的问题,你这段代码用let的写法是正确的。- 第1次循环(i=0):
代码优化建议
原循环里每次都执行document.querySelectorAll("button")属于性能浪费,因为每次都会重新查询整个页面的按钮。可以提前把所有按钮存起来复用:var buttons = document.querySelectorAll(".mybutton"); var len = buttons.length; for (let i = 0; i < len; i++) { var btn = buttons[i]; btn.addEventListener("click", function(){ var text = this.innerHTML; document.querySelector("h1").innerHTML = "You Have Selected " + text; console.log(i); }); }另外变量名
doucemnts存在拼写错误,建议改成btn这类更清晰的命名。
二、点击按钮时的执行逻辑
当你点击任意一个按钮时,之前绑定的匿名函数会被触发:
var text = this.innerHTML:this指向被点击的按钮,因此会获取到该按钮上的文本内容(比如"Button 1")。document.querySelector("h1").innerHTML = "You Have Selected " + text:找到页面中的h1元素,将它的内容替换为拼接后的文本(比如"You Have Selected Button 1")。console.log(i):打印当前按钮对应的循环索引值(由于用let声明i,每个按钮对应的i是各自循环时的数值)。
内容的提问来源于stack exchange,提问作者KH SHAKIB
相关产品推荐
相关产品推荐

