[JavaScript]js单线程,闭包,以及如何处理闭包带来的一些影响

本文探讨了JavaScript的单线程特性,解释了setTimeout的工作原理,并通过示例说明了如何处理由闭包引起的副作用。在改用let关键字后,解决了变量作用域问题,实现了预期的输出效果。

在这里插入图片描述

时间输出
第0秒3
第1秒3
第2秒3

原因:js是单线程(因为他是面向web的语言,比如防止用户同时触发删除和添加,如果是多线程会导致出现bug),setTimeout中的()=>{}会被加入任务队列,js会先执行执行栈里的内容(对于上面的函数来说就是三次循环完成setTimeout),再执行任务队列(setTimeout中的函数)。

将var改为let,则输出结果为0 1 2秒分别输出0 1 2

for(let i=0;i<3;i++){
    setTimeout(
        ()=>{console.log(i);},1000*i
    )
}

应用场景

目标:点击li输出对应的i

<body>
    <ul>
        <li>000</li>
        <li>111</li>
        <li>222</li>
    </ul>
</body>
<script>
    var lis = document.getElementsByTagName("li");
    for (var i = 0; i < 3; i++) {
        lis[i].index = i;//将i赋值给lis[i].index保存到对象中
        lis[i].onclick = function () {
            console.log(this.index);
        }
    }
    //或者将var i改为let i即可
    var lis = document.getElementsByTagName("li");
    for (let i = 0; i < 3; i++) {
        lis[i].onclick = function () {
            console.log(i);
        }
    }
</script>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值