我還沒有對JavaScript閉包的基本理解;瞭解JavaScript閉包 - 將凍結變量傳遞給回調
我有一個關於具體的情況,或許也基本和常見的例子一個問題:
從1數到3在3秒內
見的jsfiddle這裏:http://jsfiddle.net/nAh8x/
代碼:
var i,
t;
t = 0;
// Case A
for(i=1; i<=3; i++) {
setTimeout(function() { log(i); }, t);
t += 1000;
}
// Case B
for(i=1; i<=3; i++) {
setTimeout(wrapper(i), t);
t += 1000;
}
function wrapper(i) {
return function() { log(i); };
}
// Log utility function
function log(msg) {
$('#log').append(msg + '<br />');
}
案例A不起作用。
很清楚,我爲什麼:每裏面功能的setTimeout時間被稱爲和訪問我變量,它的價值已經達到了4
案例乙作品。
當包裝(I)被稱爲返回
function() { log(i); };
和上面的返回值(函數)是裏面的setTimeout發生的事情。善有善報,裏面的setTimeout是完全一樣的情況一個
但是這一次,我變量已經「凍結」與通話的時間值。
爲什麼使用包裝函數讓傳遞的值被凍結?
這並不完全清楚。
Paulo,我不希望不友善,但你的開頭聲明需要修改。它應該是:「我*還沒有*對JavaScript關閉有一個基本的理解」。你所掙扎的是基本概念,即閉包捕獲它的局部變量,並繼續允許內部函數訪問這些變量和自由變量,即使在外部函數完成並返回之後。爲了發生這種情況,必須存在對內部函數的持久引用,例如通過賦值返回的函數。 –
我同意你 – Paolo
Paulo,好吧,也許我稍微不友好,但你把它放在下巴上 - 對你有好處。 –