網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
昨天考核同學(xué)js的時(shí)候問到了這個(gè)問題,結(jié)果自己忘了還有一些條件,結(jié)果當(dāng)場(chǎng)翻車,。。。。后來試了幾次,才發(fā)現(xiàn)問題所在。。想想就好笑,治學(xué)要嚴(yán)謹(jǐn)啊,馬虎不得。
直接看代碼
<script>
for (let i = 0; i < 4; i++) {
console.log(i);
}
//結(jié)果為 0 1 2 3
for (var i = 0; i < 4; i++) {
console.log(i);
}
console.log(i);
//結(jié)果為0 1 2 3
</script>
然后我們嘗試在html中加點(diǎn)代碼
我們?cè)趗l中創(chuàng)建四個(gè)li,為方便觀看,將ul的背景顏色設(shè)置為紅色
<ul style="background-color: red;width: 100px">ul
<li>li1</li>
<li>li2</li>
<li>li3</li>
<li>li4</li>
</ul>
然后我們?cè)偈褂脙蓚€(gè)for循環(huán)打印每個(gè)li標(biāo)簽
var lis=document.querySelectorAll('li'); //獲取所有l(wèi)i標(biāo)簽
for (let i = 0; i < 4; i++) { //let循環(huán)打印
console.log(lis[i]);
}
for (var i = 0; i < 4; i++) { //var循環(huán)打印
console.log(lis[i]);
}
通過控制臺(tái),我們可以看到兩個(gè)循環(huán)都成功打印出每個(gè)li標(biāo)簽,確實(shí)沒什么毛病,嗯。
然后我們?cè)诖嘶A(chǔ)上為兩個(gè)循環(huán)遍歷得到的li標(biāo)簽分別添加不同的效果,奇跡發(fā)生了,不要眨眼睛啊
// for 循環(huán)使用let 添加點(diǎn)擊事件,改變每個(gè)li標(biāo)簽的顏色為藍(lán)色
var lis=document.querySelectorAll('li');
for (let i = 0; i < 4; i++) {
// console.log(lis[i]);
lis[i].addEventListener('click',function (){
lis[i].style.color='blue';
})
}
結(jié)果如我們所料
然后再使用for循環(huán)var
//for循環(huán)使用var為每個(gè)li添加綁定事件,改變顏色為綠色
for (var i = 0; i < 4; i++) {
// console.log(lis[i]);
lis[i].addEventListener('click',function (){
// console.log(i);
// console.log(this);
lis[i].style.color='gerrrn';
})
}
結(jié)果是我們無論怎么點(diǎn)擊就是觸發(fā)不了我們的預(yù)期效果,之前我們明明使用for循環(huán)中的var選取到了每個(gè)li標(biāo)簽,為什么就是沒效果呢,而且還報(bào)錯(cuò)。
原來這其中還牽涉到同步異步的思想
當(dāng)執(zhí)行上下文到for循環(huán)中,會(huì)把for循環(huán)放到同步執(zhí)行棧中,執(zhí)行for循環(huán),然后把for循環(huán)中的內(nèi)部點(diǎn)擊事件放到異步方法里面。等到同步任務(wù),也就是for循環(huán)執(zhí)行完之后再執(zhí)行里面的點(diǎn)擊事件。
我們可以在點(diǎn)擊事件后把i打印出來
for (var i = 0; i < 4; i++) {
// console.log(lis[i]);
lis[i].addEventListener('click',function (){
console.log(i);//4
lis[i].style.color='orange';
})
}
console.log(i)=4;
我們可以看到每次點(diǎn)擊都會(huì)打印出i的值為4,數(shù)組lis的長(zhǎng)度為4,數(shù)組最大索引為3,所以找不到lis[4]。
為什么i是4?因?yàn)閒or循環(huán)最后一次循環(huán)i=3又執(zhí)行了一步i++的操作,所以為4.
為了防止出現(xiàn)這種難以預(yù)期的意外,我們可以把lis[i]改為this,因?yàn)閠his在這里指的是點(diǎn)擊的對(duì)象。
```html
for (var i = 0; i < 4; i++) {
// console.log(lis[i]);
lis[i].addEventListener('click',function (){
console.log(i);//4
console.log(this);
this.style.color='orange';
//lis[i].style.color='orange';
})
}
console.log(i)=4;
關(guān)于同步異步的理解可以參考鏈接
原文鏈接:https://blog.csdn.net/m0_64288219/article/details/125674276
相關(guān)推薦
- 2022-11-30 C語(yǔ)言中順序棧和鏈棧的定義和使用詳解_C 語(yǔ)言
- 2021-12-02 C++?函數(shù)的介紹_C 語(yǔ)言
- 2022-08-22 C++實(shí)現(xiàn)字符串切割的兩種方法_C 語(yǔ)言
- 2022-11-16 Docker如何安全地停止和刪除容器_docker
- 2022-06-17 C#關(guān)鍵字之重寫override介紹_C#教程
- 2022-06-17 C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用_C 語(yǔ)言
- 2022-06-13 CentOS7.6系統(tǒng)下Docker安裝部署教程_docker
- 2022-07-14 python利用線程生成不同尺寸的縮略圖實(shí)例詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支