面試的時候被問到這個題瞒大,然后沒能解答出來,回去想了想宵喂,想出來了一種方案糠赦。
一、首先來看看怎么實現setInterval 的:
var mySetInterval= function(fn, time) {
// 定義一個遞歸函數锅棕,持續(xù)調用定時器
var execute = function(fn, time) {
setTimeout(function(){
fn();
execute(fn, time);
}, time)
}
execute(fn, time);
}
我們來調用一下:
var set1 = mySetInterval(function() {
console.log(1);
}, 3000)
控制臺
二拙泽、那么如果我們如何實現clearInterval 呢?
首先裸燎,我們先來研究一下setTimeout :
setTimeout 返回的竟然是一串整數顾瞻,并且這些整數都不重復,還是連續(xù)的德绿,沒錯荷荤,這個就是clearTimeout 工作的時候退渗,會找到對應的id的定時器,然后清除掉蕴纳,好了会油,知道了這個,那么我們能不能把當前定義的mySetInterval 的id存儲下來呢?
var timeWorker = {}
var mySetInterval= function(fn, time) {
// 定義一個key古毛,來標識此定時器
var key = Symbol();
// 定義一個遞歸函數翻翩,持續(xù)調用定時器
var execute = function(fn, time) {
timeWorker[key] = setTimeout(function(){
fn();
execute(fn, time);
}, time)
}
execute(fn, time);
// 返回key
return key;
}
var myClearInterval = function(key) {
if (key in timeWorker) {
clearTimeout(timeWorker[key]);
delete timeWorker[key];
}
}
來看一下執(zhí)行結果:
成功!