深入解析 JavaScript 中的 setTimeout() 和 setInterval()

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

        setTimeout() 和 setInterval() 是 JavaScript 中非常常用的定时函数。合理运用它们可以实现代码的定时执行。

        但 setTimeout() 和 setInterval() 在使用方式和实现原理上有一些不同。本文将详细对比两者的区别,分析使用场景,帮你深入理解定时函数的精髓。

✨ 正文

一、setTimeout() 简介

setTimeout() 用来设置一个定时器,该定时器在定时时间到达后执行提供的回调函数。

setTimeout() 的基本语法如下:

let timeoutId = setTimeout(callback, delay);

其中 callback 是定时器触发后需要执行的函数,delay 是时间间隔,单位是毫秒。

setTimeout() 会返回该定时器的 ID。可以通过 clearTimeout() 来取消定时器。

setTimeout()函数用来设置一个定时器,该定时器在设定的毫秒数后执行提供的函数。

setTimeout()函数的语法如下:

let timeoutId = setTimeout(function[, delay, param1, param2, ...])

参数说明:

  • function:必需,要执行的函数名或函数对象。
  • delay:可选,定时器延迟的毫秒数,默认是0。
  • param1,param2:可选,传递给函数的参数。

setTimeout()返回一个timeoutId,标识该定时器,可以传入clearTimeout()来取消定时器。

使用示例:

function printHello(){
  console.log('Hello World');
}

let timeoutId = setTimeout(printHello, 2000);

clearTimeout(timeoutId);

上面代码会在2秒后执行printHello函数。

setTimeout()的一些注意事项:

  • 延时时间不是准确时间,可能受其它代码影响。
  • 回调函数会阻塞进程,如果回调函数耗时太长会有问题。
  • 参数需要正确传递,否则可能会出错。
  • 使用后需要清除定时器,否则会占用资源。

综合来说,setTimeout()是一个非常常用的定时函数,但需要注意一些使用细节。

 

二、setInterval() 简介

        setInterval() 也是用来设置定时器的,但是它会每隔一定时间重复执行提供的回调函数。

setInterval() 的基本语法如下:

let intervalId = setInterval(function, delay, param1, param2, ...)

        callback 函数会每隔 delay 毫秒重复执行。和 setTimeout() 一样,它也会返回定时器 ID,可以通过 clearInterval() 来取消定时器。

参数说明:

  • function: 必需,要重复调用的函数。
  • delay: 可选,每次调用之间的时间间隔,单位是毫秒。
  • param1,param2: 可选,传递给函数的参数。

setInterval()会返回一个intervalId,可以用clearInterval()来取消定时器。

使用示例:

let count = 0;
let max = 10;

function printCount(){
  console.log(count);
  count++;
  
  if(count === max){
    clearInterval(intervalId);
  }
}

let intervalId = setInterval(printCount, 1000);

这段代码会每隔1秒调用printCount函数,从0开始重复计数到10,然后清除定时器。

setInterval()的注意事项:

  • 间隔时间有可能不准确。
  • 回调函数运行时可能会 exceeding 间隔时间。
  • 必须清除不再需要的间隔定时器。
  • 回调函数耗时太长会影响间隔定时。

总之,setInterval()可以实现定时重复执行代码,但是需要考虑定时不准确、回调函数执行时间等问题。

三、setTimeout() vs setInterval()

setTimeout() 和 setInterval() 主要有以下区别:

  • setTimeout() 只执行一次,setInterval() 会重复执行
  • setTimeout() 延时时间到了就执行,setInterval() 是从开始时间每隔一段时间就执行
  • setInterval() 可能出现累积延迟的问题

不同场景使用:

  • 只需要延迟执行可以使用 setTimeout()
  • 需要循环执行就使用 setInterval()

使用注意事项

setTimeout() 和 setInterval() 在使用时有以下注意事项:

  • 传入的延时时间不是精确时间,受其他任务影响
  • 回调函数会阻塞进程,如果耗时太长会有问题
  • 参数和调用方式需要正确,否则可能存在逻辑错误
  • 必须清除不再需要的定时器,否则会消耗系统资源

替代方案

        比较理想的定时执行方案是使用 requestAnimationFrame() 代替 setTimeout() 和 setInterval()。

        优点是由系统控制次数,循环调用更流畅,性能也更好。

✨ 结语       

        setTimeout() 和 setInterval() 是 JavaScript 实现定时执行非常重要的工具。但是需要注意一些使用问题,例如延时不精确、回调阻塞及资源消耗等。理解它们的实现差异,使用最佳实践,可以编写出性能更好的 JavaScript 代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/337278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django从入门到精通(一)

目录 一、Django环境搭建与命令 1.1、安装 1.2、命令行 创建项目 编写代码 运行 app概念 1.3、Pycharm创建项目 1.4、虚拟环境 创建虚拟环境 - 命令行 介绍 操作 基本问题 Pycharm 项目虚拟环境 django虚拟环境【安装django最新版本】 django虚拟环境【安装指…

frida https抓包

web端导入证书、https代理即可解决大部分需求,但是,有些app需要处理ssl pinning验证。 废话不多说。frida处理ssl pin的步骤大体如下。 安装python3.x,并在python环境中安装frida: pip install frida pip install frida-tools下载frida-se…

【设计模式】你知道游戏SL大法是什么设计模式吗?

什么是备忘录模式? 老规矩,我们先来看看备忘录模式 (Memento) 的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 它的UML类图如下&a…

Django(八)

1. 管理员操作 1.1 添加 from django.shortcuts import render, redirectfrom app01 import models from app01.utils.pagination import Paginationfrom django import forms from django.core.exceptions import ValidationError from app01.utils.bootstrap import BootStr…

【MySQL】where和having的区别

🍎个人博客:个人主页 🏆个人专栏:数据库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 用途: 使用位置: 操作对象: 聚合函数: 示例: 结语 我的其他博客 前言 数据库中的 WHERE 和 HAVING 子句在 SQL 查…

排序算法整理

快速排序 C实现 void fastStore(int *a, int start, int end){if(start>end)return ;int leftstart;int rightend;int tempa[left];//设置基准值tempwhile(left < right) //左指针的位置一定小于右指针的位置{while(a[right]>temp && left < right) //左…

RabbitMQ-消息延迟

一、死信交换机 1、描述 一个队列接收到的消息有过期时间&#xff0c;消息过期之后&#xff0c;如果配置有死信队列&#xff0c;消息就会进去死信队列。 2、图解 3、过程 当生产者将消息发送到exchange1&#xff0c;然后交换机将消息路由到队列queue1&#xff0c;但是队列que…

快速入门:使用 Gemini Embeddings 和 Elasticsearch 进行向量搜索

Gemini 是 Google DeepMind 开发的多模态大语言模型家族&#xff0c;作为 LaMDA 和 PaLM 2 的后继者。由 Gemini Ultra、Gemini Pro 和 Gemini Nano 组成&#xff0c;于 2023 年 12 月 6 日发布&#xff0c;定位为 OpenAI 的竞争者 GPT-4。 本教程演示如何使用 Gemini API 创建…

浅析Java中volatile关键字

认识volatile关键字 Java中的volatile关键字用于修饰一个变量&#xff0c;当这个变量被多个线程共享时&#xff0c;这个变量的值如果发生更新&#xff0c;每个线程都能获取到最新的值。volatile关键字在多线程环境下还会禁止指令重排序&#xff0c;确保变量的赋值操作按照代码的…

书生·浦语大模型实战营-学习笔记4

XTuner 大模型单卡低成本微调实战 Finetune简介 常见的两种微调策略&#xff1a;增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理&#xff1a; 由于只有答案部分是我们期望模型来进行回答的内容…

敏捷测试和DevOpes自动化测试的区别

敏捷测试和DevOps自动化测试在以下方面存在区别&#x1f447; 1️⃣目标 &#x1f388;敏捷测试的主要目标是提供快速的反馈和持续的改进&#xff0c;以便在开发过程中尽早发现和解决问题&#xff0c;从而提高软件的质量和可靠性。 &#x1f308;DevOps自动化测试的目标是提高软…

C语言算法赛——蓝桥杯(省赛试题)

一、十四届C/C程序设计C组试题 十四届程序C组试题A#include <stdio.h> int main() {long long sum 0;int n 20230408;int i 0;// 累加从1到n的所有整数for (i 1; i < n; i){sum i;}// 输出结果printf("%lld\n", sum);return 0; }//十四届程序C组试题B…

统计学-R语言-7.1

文章目录 前言假设检验的原理假设检验的原理提出假设做出决策表述结果效应量 总体均值的检验总体均值的检验(一个总体均值的检验) 练习 前言 本章主题是假设检验(hypothesis testing)。与参数估计一样&#xff0c;假设检验也是对总体参数感兴趣&#xff0c;如比例、比例间的差…

负载均衡流程

1、负载均衡流程图 2、触发负载均衡函数trigger_load_balance void trigger_load_balance(struct rq *rq) { /* Dont need to rebalance while attached to NULL domain */ if (unlikely(on_null_domain(rq)))//当前调度队列中的调度域是空的则返回 return; i…

SpringMVC数据校验

导包 配置springmvc.xml <bean id"validator" class" org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name"providerClass" value"org.hibernate.validator.HibernateValidator ">…

『C++成长记』模板

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、泛型编程 二、函数模板 &#x1f4d2;2.1函数模板概念 &#x1f4d2;2.2函数…

羊驼系列大模型LLaMa、Alpaca、Vicuna

羊驼系列大模型&#xff1a;大模型的安卓系统 GPT系列&#xff1a;类比ios系统&#xff0c;不开源 LLaMa让大模型平民化 LLaMa优势 用到的数据&#xff1a;大部分英语、西班牙语&#xff0c;少中文 模型下载地址 https://huggingface.co/meta-llama Alpaca模型 Alpaca是斯…

ELK之Grafana读取ES-Nginx数据后地图不展示的问题

一、背景&#xff1a;Grafana读取ES-Nginx数据后地图不展示 二、解决方法 [rootsg grafana-worldmap-panel]# pwd /var/lib/grafana/plugins/grafana-worldmap-panel [rootsg grafana-worldmap-panel]# [rootsg grafana-worldmap-panel]# sed -i s/https:\/\/cartodb-basemap…

基于SpringBoot Vue高校失物招领系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Python-基础篇-数据结构-列表、元组、字典、集合

文章目录 思维导图❓ 大抵是何物数据结构切片 &#x1f4ac;具体是何物列表&#x1f4bb; list&#x1f4bb; [ ]自我介绍精神面貌使用说明生理体征增删查改 方法汇总 元组&#x1f4bb; tuple&#x1f4bb; ( )自我介绍使用说明精神面貌生理体征增删查改 字典&#x1f4bb; di…