用 setTimeout 實現 setInterval
阿新 • • 發佈:2020-07-18
window.idarr = [0]; function _setInterval(fun, time) { var id = setTimeout(function() { _setInterval(fun, time); fun(); clearTimeout(id); }, time); window.idarr.pop(); window.idarr.push(id); return window.idarr; } function _clearInterval(id) { clearTimeout(id[0]); }
因為 setInterval 是setTimeout 實現,所以 clearInterval 也要用 clearTimeout 實現。但是 setInetrval 應該返回的是一個數字,這裡就有點為難了,因為它必須返回的是正在執行的 setTimeout 函式的計時器編碼,沒辦法。我只能用陣列去儲存這個 id,因為 return window.idarr
返回的是記憶體地址,直接操作 idarr 陣列,自然就可以接收當前的計時器編碼。不知道有啥其他的好法子。
還有一個問題想不明白,為啥編碼沒有 “2” 呢?
window.idarr = []; function _setInterval(fun, time) { var id = setTimeout(function() { _setInterval(fun, time); fun(); clearTimeout(id); }, time); window.idarr.push(id); return window.idarr; } function _clearInterval(id) { clearTimeout(id.slice(-1)[0]); } var count = 0; var timerId = _setInterval(function() { count++; console.log(timerId); if(count==10){ _clearInterval(timerId); } }, 1000);
執行結果:
為啥沒有 ”2“ 呢?