js如何調用時鐘間隔為10分鐘?
通過設置定時器s
JS中循環和閉包如何理解?
提問者沒有附上代碼。根據描述,我猜代碼應該是這樣的:
for(vari1ilt6i)
{
setTimeout(function(){console.log(I)},i*1000)
}
這個循環每秒將輸出6,所以讓s分析一下這段代碼:初始I值為1,setTimeout會設置一個1*1000毫秒的定時器。在JS引擎中,定時器機制是將代碼函數(){console.log(i)}放入隊列中,等待觸發器觸發執行。但是循環代碼的執行還是在初始的JS線程中,沒有等待下一個循環馬上執行,所以從2*1000到5*1000的5個函數都推了進來,幾乎是省時的(5個周期對于現在的CPU來說基本是0毫秒)。所以從現在開始,該功能將每1、2、3、4和5秒執行一次。在我們看來,1秒鐘就輸出一次我。
接下來,讓我們讓我們看看為什么輸出5次6而不是1-5。然后,上面的過程還是在JS線程里。我按下定時器功能后,還是會被執行。此時I的值為6,進入循環體判斷ilt6失效,循環結束。JS線程結束。
在1000毫秒的觸發器被觸發后,JS解釋器被傳入codefunction(){console.log(i)},I變量對于這個函數塊是未定義的。解釋器開始從上面的塊代碼中搜索變量I。在這種情況下,只有兩層。函數的上層是JS環境的頂層,在global中找到變量I,其值為6,因此控制臺輸出6;接下來的四個觸發器觸發原理是一樣的,所以6輸出五次,間隔1秒。
為了加深我們的理解,讓讓我們稍微修改一下代碼:
for(vari1ilt6i)
{
setTimeout((function(){console.log(I)})(),i*1000)
}
結果是一個12345的瞬時輸出,因為(sourceCodeBlock)()的行為是一個立即執行行為,即在第一個JS循環線程中,sourceCodeBlock每循環執行一次,它的上一個塊就是循環體,循環體中的I變量就是當前循環中I的值。SetTimeout只是將這個閉包塊執行的結果推入定時器隊列,而這個執行當觸發器被觸發時,行結果在JS運行時環境中既不是函數類型也不是表達式類型,這沒有意義,將在引擎解釋階段進行優化。所以在接下來的5秒鐘里,瀏覽器沒有。;不要做任何事。