`

js定时器原理

阅读更多

大家先不要看后面的内容,先看下面这段简短的代码,想象i应该弹出的是多少呢?
复制代码
var t=null;
var i=0;
function a(){
i++;
if(i==20){
  return;
}
t=setTimeout(a,17);
}
a();
alert(i);


上段程序的答案是"1"。

那么为什么程序没等循环完毕就着急地开始运行alert(i)了呢,原因就出在setTimeout的原理上。

其实setTimeout和setInterval这两个定时器一旦触发,就是和js程序并行执行的,也就是他们并不在一个时间线上。计时器的作用是仅仅是做一个计划,那就是每隔一段时间执行一次目标方法。

比如我们做个周计划每周末都出去玩,这其实就是一个定时器,每隔七天出去玩一次。但是周一到周五还是要上班的,也就是说我们不能因为周末出去玩就周一到周五不干事了。

js程序也是这样的,计时器的任务我每到那个时间点会完成,但是其它时间我会继续执行下面的代码。如上程序,a函数运行到定时器前一句的时候,i的值是1,然后执行定时器,17毫秒远远大过程序的运行时间,于是js不等了继续执行,于是alert(i),也就是1。



总结成一句话:那就是定时器和js其他程序是并行执行的,互不影响!

于是开头的程序正确的写法应该是这样的:
复制代码
var t=null;
var i=0;
function a(){
i++;
if(i==20){
  alert(i);
  return;
}
t=setTimeout(a,1);
}
a();
在程序出口的地方做操作,就可以正确地弹出i了(i=20)。
分享到:
评论

相关推荐

    深入浅出理解JavaScript高级定时器原理与用法

    主要介绍了JavaScript高级定时器原理与用法,结合实例形式分析了javascript重复定时器相关问题与解决方法,并描述了函数节流的原理与相关操作方法,需要的朋友可以参考下

    JavaScript定时器实现的原理分析

    JavaScript中的定时器大家基本在平时的开发中都遇见过吧,但是又有多少人去深入的理解其中的原理呢?本文我们就来分析一下定时器的实现原理、定时器的妙用、定时器使用注意事项,有兴趣的朋友可以看下

    javascript 定时器工作原理分析

    说到 javascript 中的定时器,我们肯定会想到 setTimeout() 和 setInterval() 这两个函数。本文将从 事件循环(Event Loop) 的角度来分析两者的工作原理和区别

    js定时器怎么写?就是在特定时间执行某段程序

    定时器想必大家并不陌生吧,在本文为大家详细介绍下js中是如何实现定时器的,具体原理及代码如下,感兴趣的朋友不要错过

    js动态时钟.rar

    js动态时钟是学习js技术一个经典例题,这里用到了js的定时器原理以及时间类和对象来实现动态时钟的功能。

    js实现网站轮播图

    使用javascript利用定时器,以及函数封装原理,实现网站轮播图效果。简单的原生js实现轮播图效果,使用时请自行将代码分离

    【JavaScript源代码】vue实现简易计时器组件.docx

     在做项目中难免会碰到需要实时刷新,广告动画依次出现等等需求,刚最近基于业务需求,需要实现一个累加通话时长的计时器,这时候就需要定时器登上我们的代码舞台了,其实对于计时器,它的原理就是通过定时器来实现...

    原生js实现轮播图的示例代码

    原理: 将一些图片在一行中平铺,然后计算偏移量再利用定时器实现定时轮播。 步骤一:建立html基本布局 如下所示: <!DOCTYPE html> <html> <head> <meta charset=UTF-8> <title>轮播...

    原生js轮播.zip

    使用javascript利用定时器,以及函数封装原理,实现网站轮播图效果。简单的原生js实现轮播图效果,使用时请自行将代码分离

    JavaScript运动原理基础知识详解

    在这篇文章里,我将把JS的运动由简如深的进行分析: 运动基础 主要步骤为: 清除定时器,保证运动过程中只有一个定时器 开启定时器 开始运动,同时加入判断以便在需要时停止运动。将移动函数进行了简单的封装。 ...

    JavaScript微信小游戏飞机大战

    1.动画原理 我们平时看的动画片,为什么能动起来呢?其实是因为它们都是由一张张图片组成的,在短暂的时间播放多张图片就感觉画面是动的了。那我们如果想让飞机图片动起来,就需要不停地画飞机,并改变坐标,从而...

    JS事件循环机制event loop宏任务微任务原理解析

    首先看一段代码 async function (){ await f2() console.log('f1') } async function f2(){ console.log('f2') ...首先javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是

    全面的前端开发资料汇总

    JavaScript的单线程性质以及定时器的工作原理 来自John Resig的文章,一次讨论,发现我组长也不理解JavaScript单线程,这也是理解异步回调的基础。 JavaScript严格模式详解 深入理解JavaScript系列 来自博客园的汤姆...

    node.js事件轮询机制原理知识点

    1.timers 定时器阶段 计时和执行到点的定时器回调函数 2.pending callbacks 某些系统操作(例如TCP错误类型) 3.idle,prepare 4.poll轮询阶段(轮询队列) 如果轮询队列不为空,依次同步取出轮询队列中第一个回调...

    JS异步宏队列微队列原理详解

    宏列队:用来保存待执行的宏任务(回调),比如:定时器回调、DOM 事件回调、ajax 回调微 列队:用来保存待执行的微任务(回调),比如:promise的回调、MutationObserver 的回调 JS 执行时会区别这 2 个队列 JS ...

    原生js实现百叶窗效果及原理介绍

    原理: 如图所示,空心格子就好比是每个li,给它设定相对定位属性,设置overflow:hidden;黑块为li子元素,高度为li的2倍,设置absolute属性,我们正是要改变它的top值从而获得变化!(右上角多余块与本图无关) 布局...

    JavaScript详解(第2版)

     14.2.2 样式表的工作原理   14.3 CSS程序结构   14.3.1 注释   14.3.2 组合   14.4 常用样式表属性   14.4.1 计量单位   14.4.2 使用颜色   14.4.3 使用字体   14.4.4 使用文本   ...

Global site tag (gtag.js) - Google Analytics