5 回答

TA貢獻1942條經(jīng)驗 獲得超3個贊
var id = setInterval(function() {}, 0);
創(chuàng)建了一個新的定時器并立刻執(zhí)行,setInterval返回值為一個整數(shù),是這個定時器的唯一ID,利用了
setInterval 和 setTimeout 的返回值一定是遞增的整數(shù)這一特性,所以獲得到的ID的值一定大于之前設(shè)置的所有定時器的值。
while (id--) clearInterval(id);
逐個語句來看
while(id--){//1 clearInterval(id);//2 }
1: 將ID減一并返回給while,這里利用了while的判斷條件,如果條件是一個大于0的樹,則認(rèn)為是true,當(dāng)條件為0,則認(rèn)為是false,所以此處不會死循環(huán),因為當(dāng)id為0時,會跳出循環(huán),而 for(;;){} 不會。
2: clearInterval(id),將現(xiàn)在的ID所對應(yīng)的那個定時器清除,clearInterval 語句也可以清除 setTimeout 設(shè)置的定時器,clearInterval和clearTimeout是等效的(來源一),而且因為前文提到的 setInterval 和 setTimeout 的返回值一定是遞增的整數(shù), 所以通過這個循環(huán)可以遍歷所有一定被設(shè)定好的定時器并全部清除。
PS:雖然是遞增的但不一定是連續(xù)的整數(shù),clearInterval的入?yún)⑷绻粚?yīng)這么一個定時器也不會報錯(來源二)。
參考:
來源一: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()

TA貢獻1805條經(jīng)驗 獲得超9個贊
這段代碼先創(chuàng)建一個定時器并獲取這個定時器的ID
,然后遞減這個ID
并結(jié)束ID
對應(yīng)的定時器,實際上是利用了定時器的ID
會從小到大遞增分配的特點,實際上并不是每次迭代都有對應(yīng)的定時器存在
至于你那個for
循環(huán)不是死循環(huán)么...

TA貢獻1850條經(jīng)驗 獲得超11個贊
這段代碼是關(guān)閉所有的setInterval
每次setInterval的時候都會返回一個自增數(shù)字,可以理解為定時器的id
var id = setInterval(function() {}, 0);//創(chuàng)建一個定時器拿到最后一個定時器的id
while (id--) clearInterval(id);//拿到最后一個id然后遞減 就關(guān)閉所有的了

TA貢獻1806條經(jīng)驗 獲得超5個贊
既然是輪播圖,原生的話肯定有定時器在執(zhí)行,找到那個定時clear掉輪播圖不就不動了
如果是用的輪播圖插件,肯定會提供不自動輪播的選項,或者提供手動停止的api。
靠阻塞不太靠譜
添加回答
舉報