2017-04-02 94 views
0
  • 我是新來的js
  • 我想下面的代碼將輸出0,1,2,3, 4,5,6,7,8,9間隔10毫秒。
  • ,但它沒有像印刷,它的印刷10個十倍。
  • 是由於設置了超時或其他什麼東西?
  • 你們可以告訴我,爲什麼它的發生......這將有助於我這麼多的瞭解JS
for(var i=0; i< 10; i++) { 
    setTimeout(function(){ 
     console.log(i); 
    }, 10); 

} 
+0

循環將在第一次setTimeout之前完成,甚至在什麼時候觸發'i'已經達到最大值 – charlietfl

+0

@charlietfl我給了我<10但爲什麼它的打印10 –

回答

1

這是因爲封閉的,你應該做這樣的事情

for(var i=0; i< 10; i++) { 
    (function(j){ 
     setTimeout(function(){ console.log(j); }, 10); 
    }(i)); 
} 

這是基本的JavaScript關閉,你可以在這裏閱讀更多How do JavaScript closures work?

的問題是,for循環結束第一,所以在最後,i將等於10.之後,setTimeout函數將被調用,當他們檢查i的值時,他們會發現它等於來自for循環的最後一個值,即爲10. 我所做的操作稱爲IIFE (Immediately Invoked Function Expression),它創建爲setTimeout功能範圍的新的變量,所以當超時來臨的時候,它找到了自己的變量,並沒有改變。

+0

感謝您的回覆......在這裏我沒有分配值對於j,但其如何對於j打印......我讀您提供,但仍然我沒有得到......你可以簡單地告訴...對不起鏈接:( –