setInterval
应用场景:通过模拟解决 setInterval 不准问题
考察:
- 递归
- api 返回值是什么
- 内部函数 this 保持
- 如何停止
如何拿到最新的 tId 进行清除,解法是用引用?
setInterval能够保证以固定频率向事件队列放入回调,setTimeout不能保证。两个都不能保证固定的回调执行频率,因为存在主线程阻塞的可能
js
// setInterval(fn, 3000)
function mySetInterval(fn, wait) {
let tId = null
let self = this
function inner(_fn, _wait){
tId = setTimeout(() => {
fn.call(self)
inner(_fn, _wait)
}, wait)
}
inner(fn, wait)
return tId
}
let id = mySetInterval(() => console.log(1), 1000)
clearTimeout(id)
改进,加标记并对外提供修改方法,停止运行
考察闭包
js
function myInterval(fn, wait) {
let stop = false
function inner(){
if (stop) return
fn()
setTimeout(inner, wait)
}
setTimeout(inner, wait)
return function clear(){
stop = true
}
}
let fn = () => console.log('haha')
let clear = myInterval(fn, 1000)
clear()