關於for循環中利用索引執行函數的問題(閉包)

今天在前端技術羣中看到有位初學朋友問了個問題,我貼一下代碼:
js:html

var pList = document.getElementsByTagName("p");
for(var i=0;i<pList.length;i++){
        pList[i].onclick=function(){
            alert(pList[i].innerHTML);
        }
    }
}

html:前端

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

他的想法是點擊每個P標籤的時候獲取到點擊的p標籤的html,代碼看着沒什麼問題,可實際報錯了~
這個問題估計大部分人一開始都遇到過,爲何這條語句很差使呢?
我的理解,頁面初始化的時候i就已經從0走到了4,當你點擊P的時候,此時i已經變成了5,而pList[5]並不存在,因此會報undefined的錯誤,改法有兩種:
第一種把pList[i]改爲this,當p標籤被點擊時this直接表明p進行獲取html。
第二種就是:閉包

var pList = document.getElementsByTagName("p");
for(var i=0;i<pList.length;i++){
    (function(e){
        pList[e].onclick=function(){
            alert(pList[e].innerHTML);
        }
    })(i)
}

在點擊事件外加入當即執行函數,把i當作變量傳遞進點擊事件,這樣也可獲取到每次點擊的索引。
這個若是深入點說,就涉及到js裏相當重要的閉包環節了~
點擊事件在循環內部,然而還想調用人家的變量,就像你在別人家看着人家主人在跑步,你還想用跑步機,那麼你要麼等人家跑完了,你用着人家「跑完」的跑步機(文中的i=5),要麼你就讓主人給你同時在旁邊安裝一個如出一轍的跑步機,大家一塊兒(當即執行函數)
粗略的寫完了,嘿嘿,歡迎一塊兒探討問題指正錯誤,高手能夠跳過,寫出來也是爲了作個筆記,溫故而知新~函數

相關文章
相關標籤/搜索