首页 > 其他分享 >JS定时器详解

JS定时器详解

时间:2022-10-31 15:01:46浏览次数:50  
标签:执行 定时器 JS 详解 time timerId fn

前端定时器详解

一、简介

JS是单线程,同一时间只能执行一个任务,其他任务就得排队,后续任务必须等到前一个任务结束才能开始执行。而有时候我们需要规定时间内做一件事,比如倒计时、页面轮播图等;这个时候就需要用到JS定时器。

当我们定义了一个定时器后,定时器会进入浏览器的定时器触发线程去排队,时间到了之后再转回到JS执行线程中排队。下面就介绍JS的几种定时器:

二、定时器

2.1 setTimeout(fn,time,lang)

在规定时间内执行一次,是一次性的。

fn是时间到了要执行的js代码串;
time执行代码钱需要等待的毫秒数;
lang可选,设置脚本语言JScript | VBScript | JavaScript(历史遗留问题可忽略此参数)
每次执行定时器函数会返回一个id,用于清除定时器:clearTimeout(timerId)

示例:

var timerId = setTimeout(function () {
    console.log("1秒钟到了");
    clearTimeout(timerId);
}, 1000);

 

2.2 setInterval(fn,time,lang)

在规定时间内执行,是周期性的。

fn是时间到了要执行的js代码串;
time执行代码钱需要等待的毫秒数;
lang可选,设置脚本语言JScript | VBScript | JavaScript(历史遗留问题可忽略此参数)
每次执行定时器函数会返回一个id,用于清除定时器:clearInterval(timerId)。只有清除这个定时器之后才会停止定时,否则便会一直执行。

示例:

var index = 0;
var timerId = setInterval(function () {
    console.log(++index + "秒钟到了");
    if(index === 10) {
       clearInterval(timerId); // 十秒的时候结束运行
    }
}, 1000);

2.3 requestAnimationFrame(fn)

触发间隔跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。默认只会执行一次,只需要传递fn执行代码串。清除定时器:cancelAnimationFrame(timerId)

这个是HTML5新增的特性,可以利用这个来做无限循环的动画,相比较setTimeout、setInterval的优势在于:

它会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,提升性能;
在隐藏或不可见的元素中,它不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。

requestAnimationFrame(function() {
    console.log("屏幕刷新了!");
});

注意:requestAnimationFrame是新增的属性需要考虑兼容性,无法设置规定时间平常使用较少。

三、封装定时器类

在平常项目中很多地方都会用到这个定时功能,但是不能很好的清除对应定时器,导致事件不听调用,影响性能。当定义一个工具类后便可以轻松的创建一个定时任务,关闭时也不用担心定时id无法获取的问题。

class MyTimer {
    constructor() {
        this.timerId = undefined;
    }
    timeout(fn, time) {
        if(this.timerId) {
            clearTimeout(this.timerId)
        }
        setTimeout(fn, time);
        setInterval()
    }
    interval(fn, time) {
        if(this.timerId) {
            clearInterval(this.timerId)
        }
        setInterval(fn, time);
    }

}

这里就是简单封装了一下,保证new的一个定时器都有唯一的一个id值;具体的封装需要根据业务场景来决定。

四、总结

主要定时器误差问题,受事件循环机制影响;

根据不同需求选择对应定时器;

用变量保存定时器返回的id(清除时用到);

使用定时器时一定要先清除之前的定时器,避免定时器叠加;
————————————————
版权声明:本文为CSDN博主「星星点点微光」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IO14122/article/details/127549401

标签:执行,定时器,JS,详解,time,timerId,fn
From: https://www.cnblogs.com/123525-m/p/16844269.html

相关文章

  • cat命令详解
    cat命令详解cat命令是linux下的⼀个⽂本输出命令,通常是⽤于观看某个⽂件的内容的;一.cat主要有三⼤功能:1.⼀次显⽰整个⽂件。$catfilename2.从键盘创建⼀个⽂件。......
  • JSP的四大作用域
    图示: 注意事项:如果请求域中的数据,依次从小到大pageContext,request,session,application获取指定名称的属性,若找到了则返回,且结束该次查找。若找不到返回""。 描述:pag......
  • 直播带货源码,js实现整数和小数分开并添加不同的样式
    直播带货源码,js实现整数和小数分开并添加不同的样式1.思路1.提前写好整数部分和小数部分class样式2.再把数值转换成字符串形式,split()方法用分隔符把整数和小数部分......
  • SpringMVC入门(详解1)
    SpringMVC介绍:Springwebmvc属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:springMVC详解: 使用范围: 执行流程:架构:文字描述:用户发送请求......
  • Java算法基础 - 单链表详解(文末有配套视频)
    导航​​步骤1只用Java类能实现吗?​​​​步骤2类里面有顾客属性​​​​步骤3排队打饭​​​​步骤4从一个顾客联系到另一个顾客​​​​步骤5加一个next字段​......
  • js/react方法学习
    前言:最近看一个react工程,发现好多预发都不会,看代码如同雾里看花。 conststr='hello'constnewstr=str.split('').reduce(function(prev,current){const......
  • JavaScript打包下载最佳实践(StreamSaver.js+zip-stream.js流式下载)
    StreamSaver.js+zip-stream.js流式下载&压缩文件。部分浏览器(火狐)可能不兼容。1应用场景在实际项目中,通常存在用户手动选择下载多个文件的情况。常规的做法(服务器......
  • 终于学会了,SpringBoot整合JSP,建议收藏不然找不到了
    SpringBoot整合JSP,一个经典而且优雅的方案!步骤1pom.xml<!--servlet依赖.--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api<......
  • kindeditor配置及功能实现详解
    ​ 1.编辑器修改(可选)1.1在 ueditor/config.json 中添加代码块    /* 上传word配置 */    "wordActionName":"wordupload",/* 执行上传视频的action......
  • IDEA版SpringBoot全教程 04 整合JSP
    <!--servlet依赖.--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><dependency>......