定时器相关 setTimeout setInterval

这个问题也是在参加百度的前端技术学院中遇到的 任务中需要用js实现动画  导师给的评价中setInterval会导致bug 当时不理解   下面把自己学习的过程分享出来

再次理解单线程

  老是说js是单线程的,其实自己根本没有好好的理解好这个单线程的意思,就比如我对这个setTimeout(function(){},time)的理解就是在从现在开始到time时间点就会执行的一段代码,其实这样的理解是有问题的,定时器只是计划代码在未来的某个时间执行,但是这个时机是无法保证的 ,这句话能更好的帮助我们理解好js的单线程(是不是可以这样理解 就是各个代码对js单线程的争夺占用

其实可以把js想象是在一个时间线上运行的,我们添加的事件处理函数和ajax回调都是在这个时间线上添加一定的代码,等待执行,当前一段代码执行过后,这个时间线就处于空闲状态,就会执行后续的代码,也就出现了这样的场景就是

    var btn = document.getElementById("btn");
    btn.addEventListener("click",function(){
      setTimeout(function(){
          console.log(1);
      },1000);
      /*事件处理程序的其他逻辑*/
    },false);

这个例子能充分的反映出我之前的错误理解,上面的例子当相应点击事件,在1000ms后将一段代码加入了js执行的时间线上(队列),按我之前的理解就是1000ms后console.log(1)就会执行,但是上面的例子中事件处理程序的其他逻辑的执行时间超出了1000ms,setTimeout就不是在设置完1000ms之后执行了,因为需要等待时间线(队列)的空闲,通过上面的例子我们就很好的理解了setTimeout

setInterval

通过对setTimeout的理解,发现之前对setInterval的理解也存在问题,setInteral(function(){},time) 我的理解是间隔一定的时间段就会去执行的代码,但是这些代码之间会相互干扰吗,他们之间的切换呢 ,这些问题我都没考虑过,setInterval会导致bug我也是一头雾水

首先setInterval的功能的确是每隔一定的时间间隔在时间线(队列)中插入代码,并且js的引擎提供了这样的机制,就是当这个代码的实例已经存在这个时间线(队列)中,不会将这段代码继续的添加到时间线(队列),这样就能保证定时器的代码加入到队列中的最小事件间隔是指定的间隔,但是这种方式有一定的问题,也就是会出现bug

(1)某些间隔会被跳过

(2)多个定时器的代码执行之前的间隔可能会比预期的小

理解定时器代码实例

时间: 2024-10-18 00:06:27

定时器相关 setTimeout setInterval的相关文章

js中setTimeout/setInterval定时器用法示例

js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 function timedMsg() { setTimeout("alert('7 seconds!')",5000)//5秒后弹出信息 } setTimeout("timedMsg()",2000);//2秒后执行方法 timedMsg setInterval:在指定的时间间隔内

Javascript定时器(二)——setTimeout与setInterval

一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 setTimeout: var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); var timeoutID = window.setTimeout(code, delay); timeoutID 是该延时操作的数字ID,

js异步处理工作机制(setTimeout, setInterval)

经常谈到异步,但是发现自己一直没深入理解setTimeout, setInterval,逛论坛的时候发现了这篇好文章,分享一下. ————————————————————以下为原文————————————————————————————— 从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下下面三个函数是如何控制计时器的. var id = setTimeout(fn, de

定时器 间隔调用setInterval

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

setTimeout,setInterval回调传参

使用方式一: 标准浏览器与IE10都支持额外传参数,从第三个参数起,作为回调的参数传入.     var id = window.setTimeout(callback,10,1,2,4);     function callback(i,j,k){         alert(i+j+k);         clearTimeout(id);     }  //返回结果:7 ie6-ie9可以用以下代码模拟:(来自司徒正美的框架设计)  if(window.VBArray && !(do

Javascript 定时器篇 setTimeout和setInterval

标题定时器,让我想起了年代久远的VB,那时候也有个定时器,长的跟闹钟一样()相信跟我一样用过VB的人都不陌生.很基础的东西,但是作用却很大.记得那时候我还不太会用,忘记是用来做动画了,还是干嘛了.不过如今,已经入门编程语言了,那么就用CODE来说吧.今天我么要说的是WEB 前端技术 Javascript 的2大定时器.存活了很久,用处依旧大大大的~~~他们分别就是 setTimeout和setInterval. Javascript本身区分大小写,所以要注意 setTimeout和setInte

函数返回值(return)、定时器(setTimeout、setInterval)

一.函数的返回值:return 1.函数名+括号=return后面的值 <script> function fn1(){ return 100; } alert(fn1()); // 100 fn1()=return后面的值100 </script> 2.所有函数默认的返回值:未定义 3.return后任何代码都不被执行二.函数实参的集合:arguments 什么时候用arguments?---> 当函数参数的个数无法确定的时候实例: <script> funct

JS中定时器setTimeout,setInterval,clearTimeout,clearInterval用法

setTimeout是指过多久执行,只执行一次 setInterval是指每过多久执行一次 clearTimeout是关闭setTimeout定时器 clearInterval是关闭setInterval定时器,不让它一直执行 <html> <head> <title></title> </head> <style> </style> <script> window.onload=function(){ var

js中两种定时器,setTimeout和setInterval的区别

setTimeout只在指定时间后执行一次,代码如下: <script> //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = window.setTimeout(hello,1000); var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法 window.clearTimeout(t1);//去掉定时器 </