老师帮我检查下作业,顺便问个var与let问题。

来源:3-13 编程练习

GanKuoLong

2023-01-30 11:36:55

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <ul>
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
        <li>jquery</li>
        <li>HTML5</li>
        <li>CSS3</li>
        <li>ES6</li>
    </ul>
    <script type="text/javascript">
        //补充代码
        let lis=document.querySelectorAll('ul li')
        let arr=[]
        for(let i=0;i<lis.length;i++){
            arr.push(lis[i].innerText)
            lis[i].onmouseover=function(){
                lis[i].style.color='red'
                lis[i].style.fontSize='20px' 
                lis[i].innerHTML+='我是第'+[i]+'个'
            }
            lis[i].onmouseout=function(){
                lis[i].style.color=''
                lis[i].style.fontSize=''  
                lis[i].innerHTML=arr[i]
            }
         }
         
    //    问题描述:虽然实现效果没问题,但是这个执行流我还有点没搞懂,如果这段代码的for
    //    循环是用var声明变量条件,那么整个for循环体按理说是会先全部会执行完,并且最后鼠标
    //    进入移出应该是没有产生题目最终效果吧,因为for已经执行完了,而我的鼠标还没进
    //    入就结束了,所以无效果。但是for循环用let作为变量条件,为什么for循环体执行完后,
    //    鼠标进入移出却可以后触发监听事件呢,是因为它把每个li保存了一个独立作用域吗?
    </script>
</body>
</html>


写回答

1回答

imooc_慕慕

2023-01-30

同学你好,思路是对的,由于let会形成块级作用域,在for循环中的表达式中使用let它的每一个值都会单独存在一个独立的作用域中不会被覆盖掉。如果使用var关键字此时的i默认是全局变量,导致鼠标移入时访问i是循环结束后i的值,li[7]无法获取到对应的DOM元素,导致报错无效果。

代码可以实现效果,需要注意一个小细节,数字是从1开始的,参考如下:

https://img.mukewang.com/climg/63d753fc095efea502650177.jpg

效果图最后一个是7,因此参考优化如下:

https://img.mukewang.com/climg/63d753d20967c29203890065.jpg

 祝学习愉快~

1

前端工程师

前端入门如同写字,如果你不知道从哪开始,那就选择前端(含Vue3.x,React17,TS)

20327 学习 · 17877 问题

查看课程