[英]How i am getting long keep on in the setTimeout?
該代碼如何工作? 有人可以幫助我理解嗎?
var myArray = ['one','two','three'];
var logAll = function (){
var long = myArray.length;
for(i=0;i< long;i++){
console.log(myArray[i]);
}
setTimeout(logAll,50);
}
logAll();
據我說,myArray的長度僅為3,因此,我的日志必須給我結果為0,1,2。 沒關系。 在我的for循環外,我為logAll函數引入了setTimeout,但是logAll函數如何繼續調用for循環,而不是3次。 有人可以幫助我了解這一點嗎?
如果是這樣,為什么只調用一次?
var myArray = ['one','two','three'];
var logAll = function (){
var long = myArray.length;
for(i=0;i< long;i++){
console.log(myArray[i]);
}
}
setTimeout(logAll,50);
您一直在logAll
的末尾調用setTimeout
,因此它每50ms不斷調用一次logAll
。
此函數(logAll)在啟動時被調用一次。 然后,它從數組中獲取所有鍵/值,並在50毫秒后重復該過程,這樣做是沒有意義的,但是如果您要檢查變量的更改,則可以使用
如果是這樣,為什么只調用一次?
因為函數只會被調用一次,而不會被再次調用。 setTimeout()
僅創建一個函數調用。
setTimeout行的意思是,等待50ms,然后調用logAll。 由於它位於logAll中,因此它將自行運行,從而導致無限循環。
我不確定setTimeout行的用途,所以我將其刪除!
您要調用logAll
的時間為50毫秒,因此它每隔50毫秒運行一次for循環。 因此,看起來好像您處在永無止境的循環中,但實際上您只是在不斷開始循環,因此console.log
看起來並沒有按照正確的順序進行記錄。 例如,在一個循環完全結束之前,另一個循環已經開始。
通過添加setTimeout(logAll,50);
,您創建了一個無限循環。
如果只想記錄數組的新內容,則必須保留i
(以便在下一輪以i=3
開始),或者必須清除數組。
后者可能更好,因為這樣可以避免內存泄漏(陣列將增長,直到占用所有內存)。
要清除數組,請將length
設置為0
: myArray.length = 0;
。
[EDIT]在第二個示例中,因為setTimeout()
不重復, logAll
被調用一次。 如果要重復調用一個函數,則必須在執行該函數后再次調用setTimeout()
。
請參閱文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.