簡體   English   中英

學習Javascript,為什么這兩個函數的行為不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM