面試的時(shí)候被問到這個(gè)題,然后沒能解答出來,回去想了想,想出來了一種方案。
一、首先來看看怎么實(shí)現(xiàn)setInterval 的:
var mySetInterval= function(fn, time) {
// 定義一個(gè)遞歸函數(shù),持續(xù)調(diào)用定時(shí)器
var execute = function(fn, time) {
setTimeout(function(){
fn();
execute(fn, time);
}, time)
}
execute(fn, time);
}
我們來調(diào)用一下:
var set1 = mySetInterval(function() {
console.log(1);
}, 3000)
控制臺

image.png
二、那么如果我們?nèi)绾螌?shí)現(xiàn)clearInterval 呢?
首先,我們先來研究一下setTimeout :

image.png
setTimeout 返回的竟然是一串整數(shù),并且這些整數(shù)都不重復(fù),還是連續(xù)的,沒錯(cuò),這個(gè)就是clearTimeout 工作的時(shí)候,會找到對應(yīng)的id的定時(shí)器,然后清除掉,好了,知道了這個(gè),那么我們能不能把當(dāng)前定義的mySetInterval 的id存儲下來呢?
var timeWorker = {}
var mySetInterval= function(fn, time) {
// 定義一個(gè)key,來標(biāo)識此定時(shí)器
var key = Symbol();
// 定義一個(gè)遞歸函數(shù),持續(xù)調(diào)用定時(shí)器
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í)行結(jié)果:

image.png
成功!