网站首页 > 基础教程 正文
参考分析
setInterval 的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间将事件加入事件队列中去,只有当当前的执行栈为空的时候,才能去从事件队列中取出事件执行。所以可能会出现这样的情况,就是当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能到间隔一段时间执行的效果。
针对 setInterval 的这个缺点,我们可以使用 setTimeout 递归调用来模拟 setInterval,这样我们就确保了只有一个事件结束了,我们才会触发下一个定时器事件,这样解决了 setInterval 的问题。
参考实现
思路是使用递归函数,不断地去执行 setTimeout 从而达到 setInterval 的效果
- 简单实现
function mySetInterval(fn, timeout) {
function interval() {
fn();
setTimeout(interval, timeout);
}
setTimeout(interval, timeout);
}
- 还可以加个控制器,控制是否继续执行
function mySetInterval(fn, timeout) {
// 控制器,控制定时器是否继续执行
var timer = {
flag: true,
};
// 设置递归函数,模拟定时器执行。
function interval() {
if (timer.flag) {
fn();
setTimeout(interval, timeout);
}
}
// 启动定时器
setTimeout(interval, timeout);
// 返回控制器
return timer;
}
猜你喜欢
- 2024-11-04 可视化的 js:动态图演示 Promises & Async/Await 的过程
- 2024-11-04 JavaScript 回调 javascript 回调函数中的this
- 2024-11-04 setTimeout和setImmediate到底谁先执行
- 2024-11-04 面试官:为什么Promise比setTimeout() 快?
- 2024-11-04 淘宝小部件 Canvas 渲染流程与原理全解析
- 2024-11-04 微软 Win11/10 Edge 浏览器 Beta 105 发布(附更新内容)
- 2024-11-04 setTimeout、Promise、Async/await的区别
- 2024-11-04 通过Promise + setTimeout,实现JavaScript 的同步延迟简单示例
- 2024-11-04 js中你不知道的settimeout,一起来看看!
- 2024-11-04 Vue短文:如何在Vue.js中使用setTimeout?
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)