函数里的this为什么不能用li[i]呢?

来源:10-1 编程挑战

青云123

2016-12-26 17:26

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>实践题 - 选项卡</title>

    <style type="text/css">

*{

margin:0;

padding:0;

}

ul{

list-style:none;

text-align:center;

line-height:20px;

width:350px;

height:20px;

border-bottom:2px solid saddlebrown;

}

ul li {

float:left;

width:50px;

height:20px;

margin-right:5px;

border:solid 1px #aaa;

border-bottom:none;

}

.hide{

display:none;

}

.on {

height:17px;

border-top:2px solid saddlebrown;

border-bottom:3px #fff solid;

}

#tabs {

width:350px;

margin:0 auto;

}

#tabs div{

width:348px;

height:88px;

border:1px solid #369;

border-top:none;

}

    </style>

    <script type="text/javascript">        

    // JS实现选项卡切换

window.onload=function (){

var tabs=document.getElementById("tabs");

var ul=tabs.getElementsByTagName("ul")[0];

var li=ul.getElementsByTagName('li');

var div=tabs.getElementsByTagName("div");

for(i=0;i<li.length;i++){

li[i].aaa=i;

li[i].onclick=function (){

for(z=0;z<li.length;z++){

li[z].className='';

div[z].className='hide';

}

//document.write(i);

this.className='on';

div[this.aaa].className='';

}

}

}

    </script>

</head>

<body>

<!-- HTML页面布局 -->

<div id="tabs">

    <ul>

       <li>房产</li> 

       <li>家居</li> 

       <li>二手房</li> 

    </ul>

    <div>

        275万购昌平邻铁三居 总价20万买一居<br>

        200万内购五环三居 140万安家东三环<br>

        北京首现零首付楼盘 53万购东5环50平<br>

        京楼盘直降5000 中信府 公园楼王现房<br>

    </div>

    <div>

        40平出租屋大改造 美少女的混搭小窝<br>

        经典清新简欧爱家 90平老房焕发新生<br>

        新中式的酷色温情 66平撞色活泼家居<br>

        瓷砖就像选好老婆 卫生间烟道的设计<br>

    </div>

    <div>

        通州豪华3居260万 二环稀缺2居250w甩<br>

        西3环通透2居290万 130万2居限量抢购<br>

        黄城根小学学区仅260万 121平70万抛!<br>

        独家别墅280万 苏州桥2居优惠价248万<br>

    </div>

</div>

 

</body>

</html>


写回答 关注

3回答

  • 慕设计2738587
    2016-12-30 09:37:28

    你可以试着把i和z声明为let类型的变量,看看问题还存不存在了。

    青云123

    可以了 很神奇 那let是用来定义块级的变量吧 也就是说一般放在函数或者for循环这种局部里 是不是在全局定义就不合乎规范了啊?

    2017-01-02 16:18:05

    共 1 条回复 >

  • 慕设计2738587
    2016-12-28 09:38:59

    这是因为是全局作用域变量,for循环结束后i的值已经变为了3,onclick引用的是变换之后的值了,这是典型的闭包问题。

    青云123

    这为什么会是一个闭包的问题啊,如果按照代码运行的顺序,从上往下,在for循环里不是应该 给每个li[i]对象绑定一个onclick事件吗

    2016-12-29 11:14:50

    共 1 条回复 >

  • 青云123
    2016-12-27 08:59:15

    http://img.mukewang.com/5861b8f300010d6d12380653.jpg在第一层循环里alert(i)正常打印0,1,2但是在里面的onclick事件里alert(i)却是3,这是为什么?

JavaScript进阶篇

本课程从如何插入JS代码开始,带您进入网页动态交互世界

468861 学习 · 22582 问题

查看课程

相似问题