循环运行过程的疑问?

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            ul li{
                color: black;
            }
            ul li.active{
                color: red;
            }
        </style>
    </head>
    <body>
        <ul>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
        </ul>
        <script type="text/javascript">
            // 通过标签名来获取节点对象
            var lis = document.getElementsByTagName('li');
            for(var i = 0; i < lis.length; i++){
                lis[i].onclick = function(){
                     for(var j = 0; j < lis.length; j++){
                         lis[j].className = '';
                     }
                     this.className = 'active';
                 }
             }
        </script>
    </body>
</html>

初始化后,第一个<li>标签的innerText值为红色。

经测试,无论点击哪一个<li>标签,任何时候只有一个<li>标签中的innerText为红色。

比如我单击第三个<li>标签,最外层循环开始运行,我所理解的运行过程如下:

i = 0, 不执行循环体中的代码,所有<li>标签的class值不变。

i = 1, 不执行循环体中的代码,所有<li>标签的class值不变。

i = 2,执行循环体中的代码,先经过j=0到j=4,所有<li>标签的class值为空,然后运行this.className=‘active’使第三个<li>标签的class值改为active。

i = 3, 不执行循环体中的代码,所有<li>标签的class不变。

i = 4, 不执行循环体中的代码,所有<li>标签的class不变。

-----------------------------------------------------------------------------------------------------------------------------

现在在第一层循环中第一行添加 lis[i].className = 'active' 这个语句,实际结果与我所理解的循环过程不一致。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            ul li{
                color: black;
            }
            ul li.active{
                color: red;
            }
        </style>
    </head>
    <body>
        <ul>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
        </ul>
        <script type="text/javascript">
            // 通过标签名来获取节点对象
            var lis = document.getElementsByTagName('li');
            for(var i = 0; i < lis.length; i++){
                lis[i].className = 'active';
                lis[i].onclick = function(){
                     for(var j = 0; j < lis.length; j++){
                         lis[j].className = '';
                     }
                     this.className = 'active';
                 }
             }
        </script>
    </body>
</html>

初始化后,所有的<li>标签的innerText值为红色。

比如我单击第三个<li>标签,开始i所在的循环5次,我所理解的运行过程如下:

i = 0, 只执行lis[i].className = 'active' 语句,所有<li>标签的class值为active。

i = 1, 只执行lis[i].className = 'active' 语句,所有<li>标签的class值为active。

i = 2,执行lis[i].className = 'active' 语句,所有<li>标签的class值为active;执行循环体中的代码,先经过j=0到j=4,所有<li>标签的class值为空,然后运行this.className=‘active’使第三个<li>标签的class值改为active。

i = 3, 只执行lis[i].className = 'active' 语句,所有<li>标签的class值为active。(实际测试,i = 3 好像没有运行,因为只有第三个<li>标签的innerText为红色)

i = 4, 只执行lis[i].className = 'active' 语句,所有<li>标签的class值为active。(实际测试,i = 4 好像没有运行,因为只有第三个<li>标签的innerText为红色)

----------------------------------------------------------------------------------------------------------------------------

两段代码,不同的地方只有一行代码,第一段代码实际运行结果与我理解的过程是一致的,但是第二段代码的实际运行结果与我理解的过程有很大差别,我有个大胆的猜想,是不是运行完点击事件后,就直接退出最外层的i循环了?

i那层只是循环给li对象添加click事件,循环完毕绑定完后就和i没关系了,不存在点击后最外层循环开始运行这种情况,页面打开的时候就执行了,和点击没关系了

点击的时候j循环清空样式,this为当前点击的dom对象,添加active样式高亮变红

第二段只是多了个初始化所有li为高亮而已,click事件处理过程一样

你把for循环得var 换成 let 试试 循环绑定事件最后不要用var