前端面试题-001-定时器

126 阅读1分钟

题目

写一个 mySetInterVal(fn, a, b) 函数, 每次间隔 a, a+b, a+2b 的时间, 然后写一个 myClear, 停止上面的 mySetInterVal

分析

  1. 题目要求可理解为 a + 0*b,a + 1*b,a + 2*b,.... a + n*b,所以这里首先需要一个计数变量 n
  2. 每次定时间隔不同,应该理解为多个单独的定时器,所以选用 setTimeout()
  3. 要停止定时器,就需要保存定时器的 handler (定时器返回的ID)
  4. 利用闭包,避免使用 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秒
*/

2021-06-21_110623.png

也在学习前端, 有兴趣的小伙伴可以联系. 微信: h2o_9527 QQ群: 929330787