手写setTimeout和setInterval
手写setTimeout和setInterval
setTimeout
写代码之前需要知道setTimeout实现原理:本质上就是在给定的时间向任务队列添加回调函数,并执行。
function mySetTimeout(...rest){// 1.得到调用mySetTimeout函数时的时间戳let start =new Date().getTime();// 2.得到回调函数结束的时间let end = start+ rest[1];// 3. 监听事件变化,当事件到达指定的结束时间时,结束回调函数let timer =setInterval(()=>{let time =new Date().getTime();if(time>=end){clearInterval(timer);rest[0](rest[2]);}},17)console.log('同步执行----');
}mySetTimeout((res)=>{console.log(res);
},1000,'执行结果')------------
结果:同步执行---- # 从这里可以看出setTimeout本身执行是同步的,执行的回调函数是异步的执行结果 # 输出结果,是在1秒之后输出
setInterval
写代码之前需要知道setInterval实现原理:本质上就是每隔一定的时间向任务队列添加回调函数
function mySetInterval(...rest) {/*** rest数组接受三个参数:* 1)回调函数 rest[0]* 2)执行回调函数所需的时间 rest[1]* 3)操作元素 rest[2] */function interval() {if (rest[2] > 0) {// 2:利用setTimeout在给定的时间,就调用回调函数的原理,使用递归思想,自己调用自己.setTimeout(interval, rest[1])rest[0]();rest[2]--;}else{// 3:条件不符合,退出函数return}}// 1:利用setTimeout在mySetInterval被调用时异步调用一次。setTimeout(interval, rest[1]);console.log('同步执行----');
}
mySetInterval(() => {console.log(1)
}, 1000, 8)-----------
结果:同步执行---- # 从这里可以看出setIterval本身执行是同步的,执行的回调函数是异步的11111111 # 输出8次1
结论:
setTimeout:
1.得到调用mySetTimeout函数时的时间戳;
2.得到回调函数结束的时间;
3.监听事件变化,当事件到达指定的结束时间时,结束回调函数。
setIterval:
1:利用setTimeout在mySetInterval被调用时异步调用一次;
2:利用setTimeout在给定的时间,就调用回调函数的原理,使用递归思想,自己调用自己。
注意:
setTimeout和setIterval本身执行是同步的,执行的回调函数是异步的。
这里是一个基于hexo搭建的一个博客:https://nanxiangscholar.github.io/
欢迎访问!
手写setTimeout和setInterval相关推荐
- vue定时器的写法和setTimeout和setInterval的区别
0.前言介绍 setTimeout和setInterval都属于JS中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval ...
- Java txt 下拉刷新_手写上拉加载,下拉刷新(小demo)
背景 使用过很多下拉刷新,上拉加载的插件,虽然也知道一点原理,但似乎一直不太完全能理解它,闲来无事,手写一个,感受下,借鉴了better-scroll的源码,功能当然相差甚远,也只是个简易版的实现,大 ...
- promise 浏览器实现的源码_【大前端01-01】函数式编程与JS异步编程、手写Promise...
[简答题]一.谈谈你是如何理解JS异步编程的,EventLoop.消息队列都是做什么的,什么是宏任务.什么是微任务? 如何理解JS异步编程 众所周知JavaScript语言执行环境是"单线程 ...
- 史上最全!56个JavaScript的「手写」知识点,扫盲啦!
关注公众号 前端开发博客,领27本电子书 回复加群,自助秒进前端群 今天就带着大家来复习一下JavaScript的56个「手写」知识点哦~~~ 大厂手写题 1.实现原生 AJAX 封装 const a ...
- javascript算法+手写js面试题
链表 function ListNode(val, next) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ...
- 前端面试高频手写题目
高频手写题目 面试高频手写题目 1 实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 手写简化版: // func是用户传入需要防抖的函 ...
- 手写一个promise用法_手写一个 Promise
1 js 的基本数据类型? 2 JavaScript 有几种类型的值? 3 什么是堆?什么是栈?它们之间有什么区别和联系? 4 内部属性 [Class] 是什么? 5 介绍 js 有哪些内置对象? 6 ...
- 前端面试题之手写代码篇
原文地址:前端面试题之手写代码篇 git地址:https://gitee.com/AiShiYuShiJiePingXing/lovebetterworld 点击前往GIT 一.JavaScript ...
- 前端面试手写题汇总大全(含答案)-- 持续更新
高频 一. 柯里化函数(Currying)和反柯里化 简介 柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第 ...
最新文章
- 命令行带参数启动--命令行相关问题 代码规范
- JavaScript几个小技巧
- C# 代理HTTP请求
- 弗林的计算机体系结构分类
- 【白皮书】2020在线教育用户增长闭环白皮书.pdf(附下载链接)
- python数据结构之列表(list)——超详细
- 套现4.88亿美元,百度从此告别外卖!
- UVa 10791 Minimum Sum LCM
- ansys与solidworks关联失败,将SolidWorks模型导入ansys划分网格总是提示错误
- windows 下安装图片标注软件 labelling和出错解决
- python做网络图_使用Python的networkx绘制精美网络图教程
- linux 关闭屏幕键盘 软键盘
- 能测试手机信号不好的软件,买手机别只看性能!教你测试手机信号好坏
- ASP.NET增加微信公众号功能
- python3 绘制盖尔圆
- [android] 手机卫士黑名单功能(ListView结合SQLite增删改)
- DCM: 中间件家族迎来新成员
- 你“被5G”了吗?5G套餐无法改4G 更有运营商下架4G
- php+安装+curl_linux php安装curl扩展的方法
- 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)
热门文章
- bC技术绑定10讲③“一码双奖”的真相!
- 开源中文通信项目Freeiris将于100天后停止维护
- Tips-App瘦身的几点实践
- 2016年11月笔记
- Flink处理函数实战之二:ProcessFunction类
- j2ee课程设计_用于J2EE开发的Cloud IDE
- THINKPHP 5.1多用户商城+Ucenter整合业内第一家!
- java电梯管理_基于Java的电梯系统实现过程
- 基于hadoop的小红书电商网站用户行为分析系统毕业论文+任务书+开题报告+答辩PPT+知网查重报告+项目源码及Mysql数据
- PS 如何制作爆炸字