setTimeout与setInterval的坑以及优缺点

2023-05-16

转自:setTimeout与setInterval的坑以及优缺点 - 找寻的千寻 - 博客园

setInterval和setTimeout的缺陷和优势分析_F-ZERO-F的博客-CSDN博客_settimeout缺点

说到setTimeout与setInrerval大家可能都觉得很easy,我刚接触js的也是这样的想法,可后来在知乎看到了一道题,大概好像是这样的:

例一:

setTimeout(function(){

console.log("小马“);

setTimeout(function(){arguments.callee;},1000);

},1000)

例二:

setInterval(function(){console.log("小马“);},1000);

问一与二的区别?

说实话我刚看到这个题目的时候是懵比的,因为我觉得这两者是完全一样的呀,都是间隔1000ms之后执行回调的呀,可是既然这么问了肯定他们之间是有区别的,于是乎我就去查了相关的资料,果然,二者不仅仅是有差别的,而且定时器也颠覆了我以往的认知。

首先,这两个定时器的基本含义我就不重复了,我觉得只要是个学前端的肯定没有不知道的。为什么说定时器也颠覆了我以往的认知呢?因为我发现定时器的回调函数并不是相当于在时间到了就执行,而是有一个主js执行进程,这个进程是页面刚加载的时候页面按照加载顺序执行的js代码,此外还有一个需要在进程空闲的时候执行的代码队列,而我们所说的定时器的回调就是相当于(以上的例一为例)在1000ms之后把定时器回调放入到空闲队列中(注意,空闲队列有可能还有其它的代码,比如点击事件,因此定时器回调放入的位置不一定是空闲队列的开始位置!)举个例子:

 var i=0;

function a(){

t=setTimeout(function(){console.log("小明")},0);

}

a();

alert(”小红“);

 此时你会发现先弹出小红,又弹出的小明!!

好了,简单的可以理解位定时器和js其他程序是并行执行的,不过jquery的作者有一篇文章专门介绍这个队列的,有兴趣的可以搜一下看看!!

接下来说第二点,就是例一与例二的区别:

setInterval有个很烦的地方就是当js主程序空闲时候,执行代码队列里面的代码的时候,如果此时候我们有一个问题,定时器是等到回调执行完,才开始计时进行下次循环呢?还是只要一次计时完毕,插入回调之后不管回调执不执行就开始计时呢?答案显然是后者,这也就是我说setInterval坑比的原因啊,因为这会出现一种情况,当我们插入回调的时候前队列有别的代码在执行,这时候回调肯定是不会执行的,因此如果这个时候无限定时时间到了会再次插入回调,这个时候如果发现队列中的第一次回调没有执行,那么再次插入的回调浏览器就默认取消,(这是以防出现回调连续执行多次的情况)但是这又引发了新的情况就是有些回调是不能取消掉的?

这就是我们经常使用例一代替例二的原因,例一可以避免上述的情况。

一、弊端
1.setInterval对自己调用的代码是否报错漠不关心。即使调用的代码报错了,它依然会持续的调用下去
2.setInterval无视网络延迟。在使用ajax轮询服务器是否有新数据时,必定会有一些人会使用setInterval,然而无论网络状况如何,它都会去一遍又一遍的发送请求,如果网络状况不良,一个请求发出,还没有返回结果,它会坚持不懈的继续发送请求,最后导致的结果就是请求堆积。
3.setInterval并不定时。如果它调用的代码执行的时间小于定时的时间,它会跳过调用,这就导致无法按照你需要的执行次数或无法得到你想要的结果。

二、解决方案
使用setTimeout代替setInterval。
可以给setTimeout设置时间后,在最后调用自身。如果希望“匀速”触发。可以计算代码执行时间,用希望的延迟减去上次执行的时间。

注:有一种想法是将setInterval的延迟时间设置的长于上述的几种时间,来达到绝对的均速调用。但事实上,js的计时器因为自身机制的原因,存在4ms–15ms的误差。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setTimeout与setInterval的坑以及优缺点 的相关文章

随机推荐

  • 什么是自注意力机制(Self-attention)

    文章目录 1 Self attention的基本概念1 1 Self attention的单个输出1 2 Self attention的并行计算1 3 Multi head Self attention1 4 Positional Enco
  • Kaiming He 论文阅读笔记一——Masked Autoencoders

    2022年Kaiming大神又发表了三篇新paper xff0c 今天我们阅读其中的Masked Autoencoders Are Scalable Vision Learners以及Masked Autoencoders As Spati
  • Kaiming He论文阅读笔记二——Plain Vision Transformer Backbones for Object Detection

    Kaiming在2022年发表了一篇Exploring Plain Vision Transformer Backbones for Object Detection 文章的主要目的是追求一种包含较少诱导偏差的主干 原因在于 xff1a 允
  • 通过Python将mp4视频文件转为动画gif

    通过Python将mp4视频文件转换为动画gif有几种方法 xff0c 如imageio moviepy Pillow 这里使用imageio 43 opencv进行转换 通过conda创建虚拟环境Python Test xff0c 将终端
  • 关系型数据库种类

    常见主流数据库分类 xff1a DB2 Oracle Informix Sybase SQL Server PostgreSQL mySQL Access数据库 FoxPro数据库 Teradata 1 IBM 的DB2 DB2是IBM著名
  • 非替换元素和替换元素

    元素是文档结构的基础 xff0c 在css里面 xff0c 每个元素生成了包含内容的框 xff08 box xff09 大家都叫 盒子 但是不同的元素显示方式是不同的 xff0c 有占据一整行的 xff0c 有水平一个挨着一个的 比如 xf
  • Kaiming He论文阅读笔记三——Simple Siamese Representation Learning

    Kaiming He大神在2021年发表的Exploring Simple Siamese Representation Learning xff0c 截至目前已经有963的引用 xff0c 今天我们就一起来阅读一下这篇自监督学习论文 Si
  • 从零开始使用Realsense D435i运行VINS-Mono

    从零开始使用Realsense D435i运行VINS Mono 从零开始使用Realsense D435i运行VINS Mono xff08 1 xff09 安装测试librealsense SDK 2 0 xff08 2 xff09 安
  • VINS-Mono关键知识点总结——边缘化marginalization理论和代码详解

    VINS Mono关键知识点总结 边缘化marginalization理论和代码详解 VINS Mono关键知识点总结 边缘化marginalization理论和代码详解1 边缘化理论1 1 为什么要进行边缘化操作 xff1f 1 2 怎样
  • linux安装clang和clang-format

    EPEL网站提供了clang的RPM安装包 xff0c 所以要想在cnetOs安装clang xff0c 首先需要安装EPEL包 xff1a sudo yum install epel release 接下来安装 clang sudo yu
  • docker学习记录(2)——在 Ubuntu 16.04 上升级 Docker CE

    以root用户为例 apt get update apt get remove docker docker engine docker ce docker io y 确保卸载干净 wget qO https get docker com s
  • vins-mobile

    最近项目需求 xff0c 需要在新版ios设备上面配置vins mobile xff0c 但是vins mobile采用oc代码 xff0c 需要将其迁移到swift vins对时间戳要求比较严格 xff0c 原版修改了opencv源码 x
  • ROS入门之话题消息的定义与使用

    1 定义msg文件 xff1a 在catkin ws src learning topic文件下新建msg文件夹并在文件夹下新建Person msg文件 msg文件中代码如下 xff1a string name uint8 sex uint
  • git为什么会有冲突

    看了百度很多回答 xff0c 觉得和实操有点出入 xff0c 记录一下个人理解 结论 xff1a 冲突的产生就是各分支修改的文件版本不一致 xff08 远程冲突同理 xff09 例 xff1a 分支 m 和分支 d 都有一个相同文件 61
  • 视觉SLAM十四讲:运动方程

    SLAM xff1a 同时定位和建图 xff08 Simultaneous Localization and Mapping xff09 希望机器人从未知环境的未知地点出发 xff0c 在运动过程中通过重复观测到的地图特征 xff08 比如
  • NeRF简介及nerf-pytorch的使用

    NeRF全称为Neural Radiance Field 神经辐射场 是2020年发表的论文 xff0c 论文名字为 NeRF Representing Scenes as Neural Radiance Fields for View S
  • SLAM如何定位与建图

    SLAM xff1a 同时定位和建图 xff08 Simultaneous Localization and Mapping xff09 机器人从未知环境中的未知地点出发 xff0c 在运动过程中通过重复观测到的地图特征 xff08 比如
  • OpenMV——串口通信+发送中心位置

    串口通信 OpenMV本质还是一个单片机 xff0c 可以通过调用pyb中的UART使用串口通信 xff0c 注意发送的数据类型为字符串 xff0c 可以通过json dumps 进行字符串转换 span class token keywo
  • liunx下rpm包mysql安装脚本

    目录 文章目录 前言 一 mysqlshell安装脚本 二 xff0c mysql 配置文件 前言 liunx下mysql安装脚本shell脚本 采用的版本时 mysql 5 7 28 xff0c rpm安装方式 shell安装脚本 xff
  • setTimeout与setInterval的坑以及优缺点

    转自 xff1a setTimeout与setInterval的坑以及优缺点 找寻的千寻 博客园 setInterval和setTimeout的缺陷和优势分析 F ZERO F的博客 CSDN博客 settimeout缺点 说到setTim