如何獲取閉包中迴圈的i值
阿新 • • 發佈:2019-02-18
假設有這樣的一個問題: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+");") }