鍍金池/ 問答/HTML/ 使用定時(shí)器實(shí)現(xiàn)停止頁面所有js的原理

使用定時(shí)器實(shí)現(xiàn)停止頁面所有js的原理

最近有一個(gè)輪播圖調(diào)試,但是頁面的輪播圖一直在動(dòng),鼠標(biāo)選不中css樣式,最后在網(wǎng)上找了這么一段代碼,

var id = setInterval(function() {}, 0);
while (id--) clearInterval(id);

可以停止頁面所有js,
但不知道這是為什么,曾經(jīng)用

for(;;){}

替代過,但瀏覽器會卡死,一直搞不清這個(gè)是什么原理
但這個(gè)就沒事

會用,但不知道為什么會有這樣的效果,
所有想看看有沒有大神能分析一下

回答
編輯回答
哎呦喂

for(;;){}等同于while,會同步阻塞執(zhí)行。

setInterval(function() {}, 0)或者setTimeout(function() {}, 0),它會“盡快”執(zhí)行,并不會阻塞當(dāng)前代碼的執(zhí)行。

關(guān)鍵詞:javascript 單線程
相關(guān)文章:
http://caibaojian.com/setinte...
http://www.codeceo.com/articl...

2018年2月6日 16:41
編輯回答
獨(dú)白

既然是輪播圖,原生的話肯定有定時(shí)器在執(zhí)行,找到那個(gè)定時(shí)clear掉輪播圖不就不動(dòng)了

如果是用的輪播圖插件,肯定會提供不自動(dòng)輪播的選項(xiàng),或者提供手動(dòng)停止的api。

靠阻塞不太靠譜

2017年2月8日 13:15
編輯回答
疚幼

這段代碼先創(chuàng)建一個(gè)定時(shí)器并獲取這個(gè)定時(shí)器的ID,然后遞減這個(gè)ID并結(jié)束ID對應(yīng)的定時(shí)器,實(shí)際上是利用了定時(shí)器的ID會從小到大遞增分配的特點(diǎn),實(shí)際上并不是每次迭代都有對應(yīng)的定時(shí)器存在

至于你那個(gè)for循環(huán)不是死循環(huán)么...

2018年7月31日 04:43
編輯回答
尐飯團(tuán)

這段代碼是關(guān)閉所有的setInterval
每次setInterval的時(shí)候都會返回一個(gè)自增數(shù)字,可以理解為定時(shí)器的id

var id = setInterval(function() {}, 0);//創(chuàng)建一個(gè)定時(shí)器拿到最后一個(gè)定時(shí)器的id
while (id--) clearInterval(id);//拿到最后一個(gè)id然后遞減 就關(guān)閉所有的了
2017年10月31日 18:45
編輯回答
拼未來
var id = setInterval(function() {}, 0);

創(chuàng)建了一個(gè)新的定時(shí)器并立刻執(zhí)行,setInterval返回值為一個(gè)整數(shù),是這個(gè)定時(shí)器的唯一ID,利用了
setInterval 和 setTimeout 的返回值一定是遞增的整數(shù)這一特性,所以獲得到的ID的值一定大于之前設(shè)置的所有定時(shí)器的值。

 while (id--) clearInterval(id);

逐個(gè)語句來看

while(id--){//1
    clearInterval(id);//2
}

1: 將ID減一并返回給while,這里利用了while的判斷條件,如果條件是一個(gè)大于0的樹,則認(rèn)為是true,當(dāng)條件為0,則認(rèn)為是false,所以此處不會死循環(huán),因?yàn)楫?dāng)id為0時(shí),會跳出循環(huán),而 for(;;){} 不會。
2: clearInterval(id),將現(xiàn)在的ID所對應(yīng)的那個(gè)定時(shí)器清除,clearInterval 語句也可以清除 setTimeout 設(shè)置的定時(shí)器,clearInterval和clearTimeout是等效的(來源一),而且因?yàn)榍拔奶岬降?setInterval 和 setTimeout 的返回值一定是遞增的整數(shù), 所以通過這個(gè)循環(huán)可以遍歷所有一定被設(shè)定好的定時(shí)器并全部清除。
PS:雖然是遞增的但不是連續(xù)的整數(shù),clearInterval的入?yún)⑷绻粚?yīng)這么一個(gè)定時(shí)器也不會報(bào)錯(cuò)(來源二)。
參考:
來源一:which means you can technically use clearTimeout() and clearInterval() interchangeably——出自MDN-WindowTimers.clearTimeout()
來源二:Passing an invalid ID to clearTimeout() silently does nothing; no exception is thrown.——出自MDN-WindowTimers.clearTimeout()

2018年3月27日 01:10