大佬们 为什么点击每个按钮都显示是4啊
javascript吧
全部回复
仅看楼主
level 1
zzhhtt0407 楼主
2022年03月19日 16点03分 1
level 12
其实你可以用foreach的...
2022年03月19日 17点03分 3
level 3
可能是var的问题
2022年03月19日 18点03分 4
你改let试试
2022年03月19日 18点03分
level 6
你的for循环btn.length=4你打印的是for循环的内部产量i,你说他为什么是4?你要是打印btn中的某个属性那就会不一样,前提是那个属性每个btn都不一样
2022年03月20日 01点03分 6
level 3
let i
2022年03月20日 01点03分 7
level 3
你的绑定事件是异步的,循环是同步的,var i又是个全局变量,等异步任务执行的时候,同步任务早就执行完了,所以异步里面的i早就是4了。
2022年03月20日 01点03分 8
很明显,不管同异步,上面的结果说明楼主肯定是等for循环里面的执行完了才去点的
2022年03月20日 12点03分
这层楼就是正解
2022年03月29日 16点03分
level 1
可能是你太厉害了,就显示4
2022年03月20日 03点03分 9
level 3
好家伙,说是var问题同学,你们有认真学过javascript吗,这明显是异步和同步的问题
2022年03月20日 04点03分 11
你说的也不对
2022年03月20日 08点03分
level 1
for循环会产生块级作用域,var声明不支持块级作用域,只支持函数作用域和全局作用域,而且存在着变量提升,所以就一直输出4了。用let声明就好了
2022年03月20日 07点03分 12
level 5
多看看闭包!
2022年03月20日 08点03分 13
level 8
点击的时候,for循环已经结束了,此时i变成4了。可以用立即执行函数或者let解决,建议看一下作用域链,闭包
2022年03月20日 11点03分 14
level 2
去掉var
2022年03月22日 07点03分 15
level 1
只要你手速够快,在for循环执行完之前,你就可以输出1,2,3,4[滑稽]
2022年03月28日 12点03分 16
level 4
var只有全局和函数作用域,当你点击的时候,沿着作用域链找,onclick函数中没有i,最后只能找到现在全局的这个i,而此时的i为4,所以打印都是4。现在我们换let声明,因为let是块级作用域,同理沿着作用域链找,每一次for循环都有一个块级,都能找到i的值,所以打印是,0,1,2,3。改下楼主的例子for中,创建一个函数作用域:
((index) => { btns[i].onclick = () => { console.log(index); };})(i);
2022年03月30日 02点03分 19
level 2
i是全局变量 for循环是同步快执行 btn里是回调函数 先给4个btn绑定事件 这时i就变成了4是全局变量 你点击发生事件是异步 这时候输出i就是同步走完了之后的i 就是4
2022年03月30日 14点03分 20
1 2 尾页