1. 程式人生 > >如何獲取閉包中迴圈的i值

如何獲取閉包中迴圈的i值

假設有這樣的一個問題:ul中含有多個li標籤,我們想對每個li繫結點選事件,並且打印出該li為第幾個li元素

一般寫法是寫一個for迴圈

var lis = document.getElementsByTagName("li");
 for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = function(){

        console.log(arg);
    };      
 }

但是,這樣寫之後我們發現,點選任何一個li,列印的值都為5,這是因為閉包中共用i值,而i的值由於執行for迴圈,都變為了5

為了正常顯示i值,我們可以使用如下方法

//方法1:加一層閉包 將i值以引數形式傳遞給內層函式
 for (var i = 0; i < lis.length; i++) {
    (function(arg){
        lis[i].onclick = function(){
            console.log(arg);
        };
    })(i)   
 }

/*方法二:加一層閉包,i以區域性變數形式傳遞給內層函式*/
for (var i = 0; i < lis.length; i++) {
    (function(){
        var temp = i;
        lis[i].onclick = function(){
            alert(temp);
        }
    })()    
 }

/*方法三:將i值作為物件的屬性值*/
for (var i = 0; i < lis.length; i++) {
    lis[i].i = i;
    lis[i].onclick = function(){
        console.log(this.i);
    }
 }

/*方法4:用function實現 實際上,沒產生一個函式例項就會產生一個閉包*/
 for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = new Function("console.log("+i+");")
 }