关于JavaScript中“this”中的问题
黄舟
黄舟 2017-04-11 12:57:37
[JavaScript讨论组]
  1. .为什么将以下代码中this,用sui[a]替换时,运行不出效果;

  2. .代码如下




    
    Title
    










黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(4)
巴扎黑

写个详细一点的- -

    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值,或者利用闭包来保存。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号