setInterval()和setTimeout()方法都是js原生的定时方法,当然它们两个的作用也是不同的,并且最近在做上下滚动公告栏的时候,发现了setInterval()非常令人抓狂的问题,那就是用setInterval()做的定时滚动会随着浏览器页面切换变得无法控制!为什么会说无法控制呢,因为在切换页面一段时间之后,我本设置3秒滚动一次变成了一秒一次,滚动变得越来越快了。对于这个问题我花了一个上午得时间去解决。下面我们先了解一下setInterval()和setTimeout()方法的区别
setInterval()和setTimeout()方法的区别
setInterval()可按照指定的周期(以毫秒计)来调用函数或计算表达式,直到直到clearInterval()方法 被调用或窗口被关闭。。简单的说就是每几秒执行一次,无限执行。
而它的用法也非常简单。
setInterval(function(){ alert("Hello"); }, 3000);
这句代码的意思是每3秒弹出一个“Hello”对话框。(每3秒弹出一次,无限弹出)
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。简单得说就是几秒之后,你把我交给你得任务执行了。(执行一次)
setTimeout(function(){ alert("Hello"); }, 3000);
这句代码的意思是3秒之后弹出一个“Hello”对话框。(只弹出一次)
了解完setInterval()和setTimeout()的区别后,如果你想做一个一直滚动的公告栏,肯定会选择setInterval()方法吧,当然我也是这样选的,刚开始感觉还不错,直到我发现了前面所说的那个setInterval越来越快的问题.......
setInterval()的弊端越来越快的问题
经过仔细排查之后,我排除了我自己代码的问题,于是就开始查各种资料。最后才晓得这是setInterval()自身的问题。下面引用大佬的一段话来解释为什么使用setInterval会出现越来越快的问题。
“JavaScript是运行在单线程的环境中的,所以这就意味着定时器就成了要执行的计划!而不是必须要执行的铁律! 为啥呢? 当函数开始执行时在栈中创建出来一个栈帧,这个栈帧的执行是需要时间的,假设有3秒,在这三秒内,JavaScript的单线程特点就会确保在这3秒内全力的专一的去解决掉这个栈帧(函数)。所以在这个函数运行的时候定时器是没有能力终止他的运行的,因此当函数的运行时间大于间隔时间时,间隔时间1秒到了,但是程序还有2秒没有执行完,那你也给我老老实实的等着函数执行完!!!”
知道了问题的原因,那我们再来看一下怎么去解决这个问题。
使用setTimeout循环来解决setInterval越来越快的问题
代码很简单,直接上代码
var i=0;
function show() {
console.log(i);
i++;
if(i<5){
setTimeout(show,1000);
}
}
show();
上面也就是做了一个setTimeout循环,让setTimeout也可以达到setInterval()无限循环的效果,但是不会出现setInterval()越来越快的问题。
来源:https://www.cnblogs.com/gold404/archive/2018/11/24/10011675.html
这篇文章将带你深入理解js中定时器是如何工作的,setTimeout和setInterval的原理是什么?
在开发一个在线聊天工具时,经常会有过多少毫秒就重复执行一次某操作的需求。“没问题”,大家都说,“用setInterval好了。”我觉得这个点子很糟糕。
之前印象中一直记得setInterval有一些坑,但是一直不是很清楚那些坑是什么。setInterval会无视代码的错误、setInterval会无视任何情况下定时执行、、setInterval不能确保每次调用都能执行
setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行。它返回一个整数,表示定时器timer的编号,可以用来取消该定时器。JavasScript引擎是基于事件驱动和单线程执行的,JS引擎一直等待着任务队列中任务的到来
用Cron表达式完成定时器,全局内关闭定时器需要获取到定时器的引用,scheduleJob存在第四个参数,然而readme中没有提及,可知API
主要是利用定时器,点击开始IDE时候不断的执行,并同时生成随机数,利用数组的下标完成展示。主要用到的知识点:setInterval,Math.random()
JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout、setInterval、setImmediate、requestAnimationFrame。JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下。
之前在项目中写了定时器来做循环播放,但是总是会有越走越快的问题,开始是以为前后的HTML代码拼接的有问题,时间紧急的情况下反复改了很多也没什么效果,后来发现是js定时器的问题,在这里记录一下。
JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout、setInterval、setImmediate、requestAnimationFrame。setTimeout: 设置一个定时器,在定时器到期后执行一次函数或代码段
使用 setTimeout()和 setInterval()创建的定时器可以用于实现有趣且有用的功能。执行时机是不能保证的,因为在页面的生命周期中,不同时间可能有其他代码在控制 JavaScript 进程。在页面下载完后的代码运行
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!