扫码关注官方订阅号
.为什么将以下代码中this,用sui[a]替换时,运行不出效果;
.代码如下
Title 按钮 按钮 按钮 按钮 按钮
人生最曼妙的风景,竟是内心的淡定与从容!
写个详细一点的- -
for (var a = 0; a < sui.length; a++) { sui[a].index = a; //将当前循环的a值保存为当前按钮的index sui[a].onclick = function() { for (var b = 0; b < sui.length; b++) { sui[b].className = ''; } cosole.log(a); sui[this.index].className = 'car'; }; }
console.log(a);你就会发现,a返回的都是最后循环结束的值,你这里就是5,然后你只有5个按钮,就是01234...所以代码无效。
sui[a].index = a可将每个循环的a的值存储到index,然后使用this.index调用,所以应该是sui[this.index]
或者你把最外层的for的var改为let也行,这个写tab选项卡、轮播的控件的时候你都会用得到。
最后你的问题,this是什么?
if (sui[this.index] === this) { console.log('true'); }
var sui=document.getElementsByTagName("button"); for(var a=0;a<sui.length;a++){ sui[a].onclick=(function (idx) { for(var b=0;b<sui.length;b++){ sui[b].className="" } sui[idx].className="car" })(a); }
但我不会告诉你为w什么。
典型的闭包问题,想深入理解的话自己多看书吧。
sui[a].onclick=function () { for(var b=0;b<sui.length;b++){ sui[b].className="" } console.log(a) //打印下a的值你就知道了 sui[a].className="car" //这句话会报错的 }
最简单的解决方法是把for循环中的var换成let
for(let a=0;a<sui.length;a++)
可以利用自定义属性保存正确的a值,或者利用闭包来保存。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
写个详细一点的- -
console.log(a);你就会发现,a返回的都是最后循环结束的值,你这里就是5,然后你只有5个按钮,就是01234...所以代码无效。
sui[a].index = a可将每个循环的a的值存储到index,然后使用this.index调用,所以应该是sui[this.index]
或者你把最外层的for的var改为let也行,这个写tab选项卡、轮播的控件的时候你都会用得到。
最后你的问题,this是什么?
但我不会告诉你为w什么。
典型的闭包问题,想深入理解的话自己多看书吧。
最简单的解决方法是把for循环中的var换成let
可以利用自定义属性保存正确的a值,或者利用闭包来保存。