[英]Learning Javascript, why do these two functions behave differently?
學習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,但我不明白原始設置是如何避免這個問題的。
你需要閱讀有關閉包的內容。 查看此答案JavaScript閉包如何工作? 了解他們。
例1
閉包立即執行腳本,並允許您傳遞存儲的參數,並保存在該函數中。 參數== PARAM
(function(param){})(parameter)
在您的示例中,該函數返回另一個將由setTimeout執行的函數。
(function(param){
return function(){
alert(param)
}
})(parameter)
當您將參數先前傳遞給函數時,它將返回正確的值。
例2
setTimeout被調用3次非常快,但參數不存儲在任何地方,因此從txt&i得到最后一個值,並且在執行setTimeout之前循環結束,值為3
基本上在第一個例子中,您將每個txt [i]存儲在您使用這些閉包創建的每個函數中。
在第二個你不存儲txt [i]的任何地方。 你只需告訴setTimout函數提醒txt [i],在1秒之后是for循環創建的最后一個。
在第一個版本中, txt[i]
已綁定到一個新變量msg
,它是每個正在創建的function
的不同位置。
在第二個版本中, i
是每個function
的相同位置,因為i
的范圍更進一步; 每次循環都沒有創建新的i
變量。
這是一個並發問題。
setTimeout為每次執行創建一個“線程”,但在超時到期之前不會評估該函數。
所以,在一秒鍾之后,當第一個超時到期時,你的for循環結束了( i
值為3),所以訪問txt[i]
返回undefined。 嘗試使用console.log
在函數內打印i
的值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.