题目
写一个 mySetInterVal(fn, a, b) 函数, 每次间隔 a, a+b, a+2b 的时间, 然后写一个 myClear, 停止上面的 mySetInterVal
分析
- 题目要求可理解为 a + 0*b,a + 1*b,a + 2*b,… a + n*b,所以这里首先需要一个计数变量 n
- 每次定时间隔不同,应该理解为多个单独的定时器,所以选用 setTimeout()
- 要停止定时器,就需要保存定时器的 handler (定时器返回的ID)
- 利用闭包,避免使用 this,仅把需要的向外暴露
实现
function mySetInterVal(fn, a, b) {
let n = 0 // 计数
let hTime = null // 定时ID, 停止时要用到
// 1.开启
function start() {
hTime = setTimeout(() => {
fn()
n++ // 定时器到时了, 才执行此处3行代码
start() // 执行下一个定时器
}, a + n*b)
}
// 2.停止
function myClear() {
clearTimeout(hTime)
}
// 3.只把用到的两个方法以对象形式返回(对外暴露)
return {start, myClear}
}
测试和结果
var xxx = mySetInterVal(() => {
// 当打当前时间
console.log((new Date).toLocaleTimeString())
}, 1000, 2000)
/*
每次<间隔>为
1 + 0 = 1秒
1 + 2 = 3秒
1 + 4 = 5秒
1 + 6 = 7秒
1 + 8 = 9秒
1 + 10 = 11秒
1 + 12 = 13秒
*/
也在学习前端。个人微信:h2o_9527 QQ群:929330787