㈠ js閉包怎麼寫
varresult=[];
functionfoo(){
vari=0;
for(;i<3;i=i+1){
result[i]=function(){
alert(i)
}
}
};
foo();
result[0]();//3
result[1]();//3
result[2]();//3
這段代碼中,程序員希望foo函數中的變數i被內部循環的函數使用,並且能分別獲得他們的索引,而實際上,只能獲得該變數最後保留的值,也就是說.閉包中所記錄的自由變數,只是對這個變數的一個引用,而非變數的值,當這個變數被改變了,閉包里獲取到的變數值,也會被改變.
解決的方法之一,是讓內部函數在循環創建的時候立即執行,並且捕捉當前的索引值,然後記錄在自己的一個本地變數里.然後利用返回函數的方法,重寫內部函數,讓下一次調用的時候,返回本地變數的值,改進後的代碼:
varresult=[];
functionfoo(){
vari=0;
for(;i<3;i=i+1){
result[i]=(function(j){
returnfunction(){
alert(j);
};
})(i);
}
};
foo();
result[0]();//0
result[1]();//1
result[2]();//2