前言:
1.事件綁定,setTimeout()/setInterval() 等定時(shí)調(diào)用屬于異步操作。在for循環(huán)中運(yùn)行會(huì)把它們放到最后運(yùn)行.
2.alert(),console.log()屬于同步操作
問題1.

上述代碼執(zhí)行后報(bào)錯(cuò):"choose[i] is undefined"。請(qǐng)分析原因。
解釋.

將for循環(huán)進(jìn)行拆解

實(shí)際執(zhí)行順序
for 循環(huán)里面給 choose 的每一個(gè)元素的 onclick 事件設(shè)置為一個(gè)匿名函數(shù),而這個(gè)函數(shù)在 for 循環(huán)階段是還沒有執(zhí)行的(等到點(diǎn)擊時(shí)才會(huì)觸發(fā) onclick 事件執(zhí)行),匿名函數(shù)里面的 choose[i] 保存著對(duì) i 的引用,注意只是保存著引用,沒有把當(dāng)前 i 的值直接賦值到每個(gè) choose[i]。
隨后 for 循環(huán)執(zhí)行完畢,正常情況下執(zhí)行完 for 循環(huán),i 就會(huì)被垃圾回收器回收,但是這里匿名函數(shù)保存了對(duì) i 的引用,所以 i 沒有被回收,執(zhí)行完 for 循環(huán)后,i = choose.length,還繼續(xù)留著內(nèi)存里。
而當(dāng)點(diǎn)擊后觸發(fā) onclick 事件時(shí),被賦值給 onclick 的匿名函數(shù)被執(zhí)行,這時(shí)候開始把 i 的值賦值給匿名函數(shù),而此時(shí) for 循環(huán)已經(jīng)執(zhí)行完畢,i = choose.length,choose[i] 當(dāng)然是 undefined了,也就無法讀取 checked 屬性了。
問題2.

為什么第二段代碼,結(jié)果只彈出一個(gè)5
該循環(huán)給同一元素添加了5次點(diǎn)擊事件的綁定,但onclick方式只能為元素綁定一個(gè)點(diǎn)擊事件,后續(xù)的綁定只會(huì)覆蓋而不會(huì)追加,問題不在循環(huán),在于事件綁定的方式