目录
案例
setTimeout和setInterval对比
另外,根据网上一张关于此问题比较流行的图:1
2
3
4
5
6
7function click() {
// code block1...
setInterval(function() {
// process ...
}, 200);
// code block2
}
setInterval可能会存在的问题是:
假设onclick回调函数一共要300ms执行完, block1代码执行完花了5ms, 在5ms时执行setInterval, 以此为一个时间点, 在205ms时插入process代码。当onclick回调函数顺利结束, process代码开始执行(即图中的timer code), 然而process代码也执行了一个比较长的时间, 超过了接下来一个插入时间点405ms, 这样代码队列后又插入了一份process代码, process继续执行着, 而且超过了605ms这个插入时间点,下面问题来了,可能你还会认为代码队列后面又会继续插入一份process代码,但真实的情况是,由于代码队列中已经有了一份未执行的process代码(405ms的), 所以605ms这个插入时间点将会被跳过, 因为js引擎只允许有一份未执行的process代码。
互相实现
利用setTimeout实现setInterval
这个本文刚开始的案例就是一个例子,下面再给出一个:1
2
3
4
5function f(){
console.log('setTimeout模拟setInterval,每秒钟打印一次');
setTimeout(f, 1000);
}
setTimeout(f, 1000);
可以看到控制台每秒钟打印一次:
利用setInterval实现setTimeout
1 | function f(){ |
可以看到控制台只打印一次: