2011-11-22 97 views
0

這段代碼如何工作?任何人都能幫助我理解?根據我的說法,myArray的長度只有3,所以,我的日誌必須給我的結果爲0,1,2。沒關係。在我的for循環中,我爲logAll函數引入了setTimeout,但是如何logAll函數繼續調用for循環而不是3次,以至於......?任何人都能幫助我理解這一點?我如何在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); 

回答

3

你保持在logAll結束通話setTimeout,所以它不斷給你打電話logAll每隔50ms。

+0

問題更新.. – 3gwebtrain

+1

@ 3gwebtrain我很困惑。爲什麼它只在第二個代碼中運行一次?因爲它在'setTimeout'結尾處被調用一次,並且再也不會被調用。一個'setTimeout'超時,調用給它的方法,就是這樣。 –

+0

在第一個函數中,我沒有在循環內部保留「setTimeout(logAll,50);」,這就是爲什麼我很困惑。我的函數只調用一次,以及它一次調用內部函數..那麼如何內部函數調用繼續? – 3gwebtrain

1

該函數(logAll)在啓動時調用一次。然後它獲得陣列中的所有鍵/值,並且在50ms後它重複該過程,這是沒有意義的,但是如果想要檢查變量變化則可用

如果是這樣,爲什麼這是隻打一次?

因爲函數只被調用一次而不再一次。 setTimeout()僅創建一個函數調用。

+0

如果我放置setTimeout(logAll,50);在一個函數內部,那麼它會繼續調用? - 這是對的嗎? – 3gwebtrain

+0

是的。在問題被調用之後,setTimeout再次執行,再次執行該函數......等等。這就是所謂的遞歸 –

+0

是的,明白。謝謝。 – 3gwebtrain

1

setTimeout行表示等待50ms,然後調用logAll。因爲它在logAll中,它會自行運行造成無限循環。

我不確定setTimeout行的目的,所以我會刪除它!

+0

爲什麼要刪除它?一些無限循環也是有用的 –

+0

好吧,在這種情況下,我假設它不是所需的行爲。 –

1

您正在呼叫logAll 50毫秒,因此它每50毫秒運行一次for循環。所以看起來好像你處在一個永無止境的循環中,但事實上,你只是不斷地開始循環,並且你的console.log看起來並不像按照正確的順序登錄。例如在一個循環完成之前,另一個循環已經開始。

1

通過添加setTimeout(logAll,50);,您創建了一個無限循環。

如果你想記錄只有內容的數組,你要麼必須保持i(這樣你在下一輪與i=3開始),或者你必須清除陣列。

後者可能更好,因爲這樣可以避免內存泄漏(數組會增長直到需要所有內存)。

要清除該陣列,請將length設置爲0myArray.length = 0;

[編輯]在第二個例子中,logAll被調用一次,因爲setTimeout()不重複;如果要重複調用一個函數,則必須在執行該函數後再次調用setTimeout()

See the documentation

+0

問題更新.. – 3gwebtrain

相關問題