js中setTimeout和setInterval的深入理解:它们之间的区别,原理,“异步“等

时间: 2017-11-16阅读: 1697标签: 定时器

setTimeout和setInterval的区别

setTimeout在执行时,是在载入后延迟指定时间后,去执行一次表达式,而setInterval则不一样,它从载入后是每隔指定的时间就执行一次表达式。当然我们可以通过重复调用setTimeout的方法,实现类似于setInterval一样达到周而复始的效果,下面我们就实现用setTimeout来模拟setInterval的效果:

function interval(fn,time){  //每隔1秒让++i
    fn();
    setTimeout(()=>{arguments.callee(fn,time);},time);//通过arguments.callee调用自身
}
//执行Interval函数
var i=0
interval(()=>{++i;console.log(i)},500); 
//重写Interval函数,从而起到关闭定时器的效果
interval = null;


setTimeout和setInterval的原理

但是需要注意的是:无论setTimeout还是setInterval里面的函数执行并不是时间到了就执行,而是:js主进程按顺序执行程序的同时,还有一个在进程空闲的时候执行的程序队列,而定时器就相当于在多少毫秒之后把回调函数放入空闲队列中去执行。如果空闲队列中同时存在其它程序,定时器中的回调执行顺序就不确定了。例如:

setTimeout(()=>{console.log("我是0秒执行")},0);
( function(){
	console.log("我是匿名函数中执行的")
})();
console.log("我在后面哦!");
//输出顺序:我是匿名函数中执行的  我在后面哦  我是0秒执行

看了上面的中输出我们会发现即使定时器中设置的时间为0,它仍然是最后输出的,由此可以看出它的时间并不是那么准确了,而是在js进程空闲的时候执行的。


setTimeout和setInterval的“异步”

通过上面我们已经知道,回调函数的执行是在多少时间插入空闲队列中并按顺序去执行,来达到延迟的效果,所以它的异步只是一个假象:它同样运行在一个线程上! 因为JS始终是单线程执行的。

那么如果在它们执行之前插入一个死循环,setTimeout和setInterval中的回调函数还会在执行吗,例如:

setTimeout(()=>{console.log("我还会执行吗?")},0); 
while(true) {};
console.log("执行不了我了!");

我们可以看到在控制台中什么都不会输出,直接是由于js是单线程,比堵塞了。而且有趣的是,你执行了这个代码,点击浏览器关闭当前页面都没反应了...


这篇文章就整理到这里了,希望对你的学习有一定的帮助。

站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/115

JS中的定时器-案例解析

倒计时定时器是在指定时间到达后触发事件,而循环定时器就是在间隔时间到来时反复触发事件,两者的区别在于:前者只是作用一次,而后者则不停地作用。

浅谈JS之setTimeout与setInterval

setTimeout与clearTimeout,以及setInterval与clearInterval均属于Window对象方法。实例简单描述:该实例是通过Vue实现的,具体操作要求是单击【开始游戏】按钮3秒钟后执行走马灯效果,单击【结束游戏】按钮停止走马灯效果,具体代码如下:

js中如果遇到低版本安卓设备调用setTimeout不生效解决办法

工作中会遇到低版本安卓设备调用setTimeout不生效,既不会报错,里面的函数也不会执行,这里po一个解决办法,如果不执行则执行安卓自己封装的原生的setTimeout方法:sdk.setTimeout。

在vue组件中设置定时器和清除定时器

由于项目中难免会碰到需要实时刷新,无论是获取短信码,还是在支付完成后轮询获取当前最新支付状态,这时就需要用到定时器。 但是,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况

Js中setTimeout()、setInterval()、链式setTimeout()

使用 setTimeout()和 setInterval()创建的定时器可以用于实现有趣且有用的功能。执行时机是不能保证的,因为在页面的生命周期中,不同时间可能有其他代码在控制 JavaScript 进程。在页面下载完后的代码运行

JS 定时器的4种写法及介绍

JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout、setInterval、setImmediate、requestAnimationFrame。setTimeout: 设置一个定时器,在定时器到期后执行一次函数或代码段

Js定时器越走越快的问题

之前在项目中写了定时器来做循环播放,但是总是会有越走越快的问题,开始是以为前后的HTML代码拼接的有问题,时间紧急的情况下反复改了很多也没什么效果,后来发现是js定时器的问题,在这里记录一下。

js定时器setTiemout、setInterval

JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout、setInterval、setImmediate、requestAnimationFrame。JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下。

js 随机点名

主要是利用定时器,点击开始IDE时候不断的执行,并同时生成随机数,利用数组的下标完成展示。主要用到的知识点:setInterval,Math.random()

如何通过setTimeout理解JS运行机制详解

setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行。它返回一个整数,表示定时器timer的编号,可以用来取消该定时器。JavasScript引擎是基于事件驱动和单线程执行的,JS引擎一直等待着任务队列中任务的到来

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广