學習Javascript並不能弄清楚爲什麼這兩個函數是不同的。我看到這個例子(我給函數添加了名字):學習Javascript,爲什麼這兩個函數的行爲有所不同?
var txt = ["a","b","c"];
for (var i = 0; i < 3; ++i) {
setTimeout((function myBind(msg) {
return function myAlert() { alert(msg); }
})(txt[i]), 1000);
}
我看到一個調用alert的函數正在返回。所以我想,爲什麼不直接把它直接返回:
var txt = ["a","b","c"];
for (var i = 0; i < 3; ++i) {
setTimeout(function() { alert(txt[i]);} ,1000);
}
這最終警告'未定義。我知道這是因爲它試圖訪問txt [3],因爲一秒後循環結束,我已設置爲3,但我不明白原始設置如何避免此問題。
研究閉包以及如何使用這個概念來控制變量的範圍。應該以正確的方向啓動你。 – deostroll
常見問題;傳遞函數而不是傳遞閉包。在爲事件處理程序傳遞函數時也使用它。關於閉包的很好的解讀:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures – HMR