- 我是新來的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);
}
for(var i=0; i< 10; i++) {
setTimeout(function(){
console.log(i);
}, 10);
}
這是因爲封閉的,你應該做這樣的事情
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
功能範圍的新的變量,所以當超時來臨的時候,它找到了自己的變量,並沒有改變。
感謝您的回覆......在這裏我沒有分配值對於j,但其如何對於j打印......我讀您提供,但仍然我沒有得到......你可以簡單地告訴...對不起鏈接:( –
循環將在第一次setTimeout之前完成,甚至在什麼時候觸發'i'已經達到最大值 – charlietfl
@charlietfl我給了我<10但爲什麼它的打印10 –