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