鍍金池/ 問答/HTML/ js閉包問題:有大佬能解釋一下這個(gè)代碼是怎么執(zhí)行的嗎?

js閉包問題:有大佬能解釋一下這個(gè)代碼是怎么執(zhí)行的嗎?

這是一個(gè)常見閉包問題:

請(qǐng)問各位大佬,這個(gè)代碼是怎么執(zhí)行的,
比如說 當(dāng)點(diǎn)擊3的時(shí)候,是怎么執(zhí)行打印出2來的?


<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>

<script>

var elem = document.getElementsByTagName('div'); // 如果頁面上有5個(gè)div

for (var i = 0; i < 5; i++) {
    console.log(i);
    (function (w) {
        elem[w].onclick = function () {
            console.log(w);
        };
    })(i);
}

</script>

回答
編輯回答
不將就

for循環(huán)里面的自執(zhí)行函數(shù)的實(shí)參來自i,在你點(diǎn)擊的時(shí)候,實(shí)參i傳遞給形參w,點(diǎn)擊第三個(gè)元素的時(shí)候,i=2,w=i=2,console.log(2)

2018年5月28日 12:17
編輯回答
還吻

「立即執(zhí)行函數(shù)」保留了每個(gè)「i」的數(shù)值,而且對(duì)每個(gè)「div」都進(jìn)行了單獨(dú)的事件綁定,
所以點(diǎn)擊「div3」的時(shí)候,會(huì)輸出「2」
(從0開始,所以是2)

2017年4月8日 08:09
編輯回答
誮惜顏

你div是從1開始,1-5
i是從0開始,0-4
那么你點(diǎn)擊div 3的時(shí)候,就是第三位,而i的第三位是2,因?yàn)?是i的第一位,1是i的第二位,2是i的第三位

2017年12月11日 01:32
編輯回答
愚念

你的div內(nèi)容是從1開始的,而循環(huán)的索引是從0開始的,所以彈出來的值會(huì)比頁面顯示的對(duì)應(yīng)值小1

2017年10月8日 11:59
編輯回答
命于你
var elem = document.getElementsByTagName('div'); // 如果頁面上有5個(gè)div

for (var i = 0; i < 5; i++) {
    console.log(i);
    (function (w) {
        elem[w].onclick = function () {    # 下標(biāo)為i的div綁定一個(gè)函數(shù),函數(shù)內(nèi)容為打印當(dāng)前下標(biāo)
            console.log(w);
        };
    })(i);    # 從0-4依次調(diào)用
}
2018年8月2日 03:19