閉包的概念真的是很繞,我就來點實際的代碼。
當我用下面的代碼的時候 發生了閉包,當執行onclick事件的時候,變量一直引用了外部函數的變量,結果i總是4
function newLoad() { //建立頁面加載的事件
var temp ='' ;
for (var i = 1; i <=3; i++) {
var maodian = document.getElementById("maodian" + i); //html控件 id是以maodian為字首
maodian.onclick = function () {//為maodian添加單擊事件
alert("you clicked maodian" + i); //給出點選反應
}
}
}
為了解決上面的問題,我們我們把産生閉包的代碼提出來,建立一個方法。
這樣我們在執行 newLoad()的時候,就三次調用了newLoadExtracted方法,就可以
獲得目前的i值。
function newLoad() { //建立頁面加載的事件
var temp ='' ;
for (var i = 1; i <=3; i++) {
var maodian = document.getElementById("maodian" + i); //html控件 id是以maodian為字首
newLoadExtracted(i, anchor);
}
}
function newLoadExtracted(i, maodian) {
maodian.onclick = function () {//為maodian添加單擊事件
alert("you clicked maodian" + i); //給出點選反應
}
}
我個人了解閉包的發生就是變量作用域的問題,内部函數一直引用了外部函數的變量對象,會一直跟蹤外部函數的變量變化。
當我們新建立了一個函數後,把目前的變量值傳遞到新的函數中,新的函數 newLoadExtracted與函數newLoad就不存在變量依附的關系,
是以變量之間就不會扯不清關系了。