簡體   English   中英

我要如何長時間保持setTimeout?

[英]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設置為0myArray.length = 0;

[EDIT]在第二個示例中,因為setTimeout()不重復, logAll被調用一次。 如果要重復調用一個函數,則必須在執行該函數后再次調用setTimeout()

請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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