手写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在给定的时间,就调用回调函数的原理,使用递归思想,自己调用自己。

注意:

setTimeoutsetIterval本身执行是同步的,执行的回调函数是异步的。


这里是一个基于hexo搭建的一个博客:https://nanxiangscholar.github.io/
欢迎访问!

手写setTimeout和setInterval相关推荐

  1. vue定时器的写法和setTimeout和setInterval的区别

    0.前言介绍 setTimeout和setInterval都属于JS中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval ...

  2. Java txt 下拉刷新_手写上拉加载,下拉刷新(小demo)

    背景 使用过很多下拉刷新,上拉加载的插件,虽然也知道一点原理,但似乎一直不太完全能理解它,闲来无事,手写一个,感受下,借鉴了better-scroll的源码,功能当然相差甚远,也只是个简易版的实现,大 ...

  3. promise 浏览器实现的源码_【大前端01-01】函数式编程与JS异步编程、手写Promise...

    [简答题]一.谈谈你是如何理解JS异步编程的,EventLoop.消息队列都是做什么的,什么是宏任务.什么是微任务? 如何理解JS异步编程 众所周知JavaScript语言执行环境是"单线程 ...

  4. 史上最全!56个JavaScript的「手写」知识点,扫盲啦!

    关注公众号 前端开发博客,领27本电子书 回复加群,自助秒进前端群 今天就带着大家来复习一下JavaScript的56个「手写」知识点哦~~~ 大厂手写题 1.实现原生 AJAX 封装 const a ...

  5. javascript算法+手写js面试题

    链表 function ListNode(val, next) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ...

  6. 前端面试高频手写题目

    高频手写题目 面试高频手写题目 1 实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 手写简化版: // func是用户传入需要防抖的函 ...

  7. 手写一个promise用法_手写一个 Promise

    1 js 的基本数据类型? 2 JavaScript 有几种类型的值? 3 什么是堆?什么是栈?它们之间有什么区别和联系? 4 内部属性 [Class] 是什么? 5 介绍 js 有哪些内置对象? 6 ...

  8. 前端面试题之手写代码篇

    原文地址:前端面试题之手写代码篇 git地址:https://gitee.com/AiShiYuShiJiePingXing/lovebetterworld 点击前往GIT 一.JavaScript ...

  9. 前端面试手写题汇总大全(含答案)-- 持续更新

    高频 一. 柯里化函数(Currying)和反柯里化 简介 柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第 ...

最新文章

  1. 命令行带参数启动--命令行相关问题 代码规范
  2. JavaScript几个小技巧
  3. C# 代理HTTP请求
  4. 弗林的计算机体系结构分类
  5. 【白皮书】2020在线教育用户增长闭环白皮书.pdf(附下载链接)
  6. python数据结构之列表(list)——超详细
  7. 套现4.88亿美元,百度从此告别外卖!
  8. UVa 10791 Minimum Sum LCM
  9. ansys与solidworks关联失败,将SolidWorks模型导入ansys划分网格总是提示错误
  10. windows 下安装图片标注软件 labelling和出错解决
  11. python做网络图_使用Python的networkx绘制精美网络图教程
  12. linux 关闭屏幕键盘 软键盘
  13. 能测试手机信号不好的软件,买手机别只看性能!教你测试手机信号好坏
  14. ASP.NET增加微信公众号功能
  15. python3 绘制盖尔圆
  16. [android] 手机卫士黑名单功能(ListView结合SQLite增删改)
  17. DCM: 中间件家族迎来新成员
  18. 你“被5G”了吗?5G套餐无法改4G 更有运营商下架4G
  19. php+安装+curl_linux php安装curl扩展的方法
  20. 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)

热门文章

  1. bC技术绑定10讲③“一码双奖”的真相!
  2. 开源中文通信项目Freeiris将于100天后停止维护
  3. Tips-App瘦身的几点实践
  4. 2016年11月笔记
  5. Flink处理函数实战之二:ProcessFunction类
  6. j2ee课程设计_用于J2EE开发的Cloud IDE
  7. THINKPHP 5.1多用户商城+Ucenter整合业内第一家!
  8. java电梯管理_基于Java的电梯系统实现过程
  9. 基于hadoop的小红书电商网站用户行为分析系统毕业论文+任务书+开题报告+答辩PPT+知网查重报告+项目源码及Mysql数据
  10. PS 如何制作爆炸字