前端面试中,经常会考察对setTimeout和setInterval的理解与使用,常见面试题就如两者之间的转换了。
用setTimeout实现setInterval,代码如下
// 用setTimeout 实现setInterval
function set_interval(fn,ms){ // fn参数可以通过在后面使用...rest接受,为了测试结果明显,目前使用n传递fn参数
let n = 0;
function next(){
setTimeout(()=>{
fn.call(this,n);
n+=ms;
next();
},ms);
}
next();
this.cancel = function(){ // 可用这个控制停止计时
next = function(){};
}
return this;
}
function fun(n){
console.log(n);
}
let t = set_interval(fun,1000);
setTimeout(()=>{
t.cancel();
},5000);
而用setInterval实现setTimeout就比较简单了,代码如下
// 用setInterval实现setTimeout
function set_timeout(fn,ms){
let t;
function next(){
t = setInterval(() => {
fn.call(this);
clearInterval(t);
}, ms);
}
next();
this.cancel = function(){
clearInterval(t);
}
return this;
}
function test(){
console.log("AAA");
}
let c = set_timeout(test,2000);
setTimeout(() => {
c.cancel();
}, 1000);