当前位置: 首页 > news >正文

setTimeout,setInterval的使用小结

setTimeout

众所周知setTimeout(fn,time)是等待一段时间后,执行函数fn。
在这个等待是异步的,也就是他不会站着茅坑,当前JS队列中的其他任务会按序执行
但这里有个问题就是time毫秒过后的fn执行问题。是立即执行?不一定。
这就像是一个买票的队伍,有正在买票的,有排在后面等待买票的。而setTimeout就相当于刚排到fn买票的时候他突然发现钱包一时翻不出来。
所以他就让后面的人先买。过了time时间找到钱包后,如果现在没人买票的话,他可以立即买票。否则他就只能去排队了(当所有队列中的内容执行结束后才执行)。

复制代码
<input type="text" id="io" />
<div id="test" style="width:200px;height:400px;overflow:scroll;"></div>
<script>
//这个函数的执行时间在IE下肯定是大于100ms的
function lost() {
    var test = document.getElementById("test");
    var t1 = new Date();
    var html = [];
    for (var i = 0; i < 10000; i++) {
        html.push('<span>look at here</span>');
    }
    test.innerHTML = html.join("");
    var t2 = new Date();
    //return (t2 - t1) / 1000;纠正
    return t2 - t1;
} var io = document.getElementById("io"); io.value += "A"; setTimeout(function() { io.value += "B"; }, 100); lost(); io.value += "C"; lost(); io.value += "D"; </script>
复制代码

最后io的value为ACDB,也证明了不是100ms后立即执行,而是排到了队伍后面。

也有人见过setTimeout(fn,0);如果上面的内容理解了的话,这个也就不难了:如果没有队伍则立即执行,否则就排队去。


setInterval

setInterval(fn,time)就是一个重复的定时器。
每隔time时间,将fn推入队列(如果进程空闲则立刻执行),不管是否有fn正在执行或等待队列。
但是,如果当前队列中有正在等待的fn,则本次不会向队列中添加fn。如下

复制代码
<input type="text" id="io" />
<input type="button" id="insert" value="INSERT" />
<input type="button" id="get" value="GET" />
<div id="test" style="width:200px;height:400px;overflow:scroll;"></div>
<script>
    var io = document.getElementById("io");
    var i = setInterval(function() {
        io.value += "B";
    }, 10);
    
    lost();
    lost();
    setTimeout(function() {
        clearInterval(i);
    }, 10);
    
    //IE下执行时间肯定会是10的好多倍的
    function lost() {
        var test = document.getElementById("test");
        var t1 = new Date();
        var html = [];
        for (var i = 0; i < 10000; i++) {
            html.push('<span>look at here</span>');
        }
        test.innerHTML = html.join("");
        var t2 = new Date();
        io.value += "C";
    }
</script>
复制代码

结果是CCB
执行lost函数的时间是定时器的很多倍。但在这么长的时间里,定时器只向队列中推入fn一次。
这个原因也导致了以下两种不理想情况的出现。

①fn执行时间小于time的时候,经常会间隔时间不一致。

②fn执行时间大于time时,则造成没有了间隔时间(实际当中会有那么一点点的间隔)

因为这些问题,setInterval就失去了定时器的意义。

所以我们都用循环调用setTimeout来代替setInterval。原理如下

setInterval(fn,time)
//↓↓↓↓↓↓↓↓↓↓↓↓
setTimeout(function(){
    fn();
    setTimeout(arguments.callee,time);
},time);

这样就可以让每个fn之间都会至少保持time的间隔。 

注:setTimeout和setInterval的函数环境总是Window。

转载于:https://www.cnblogs.com/chris-oil/archive/2013/04/07/3005777.html

相关文章:

  • C# WF中关闭按钮的状态判定,根据用户选择执行不同的方法
  • iPhone上画圆角矩形的方法
  • CPP 插入排序
  • Android 获取网页内容
  • 系统子模块_短信命令语法设计
  • 高效能人士的七个习惯(部分)
  • 以XML为中间文档格式的Excel电子表格向SVG图转换
  • Visifire for Windows 8 v2.1.1.0 发布
  • JNDI 学习(转)
  • 不可不知的移动色彩设计新趋势
  • Nosql入门知识(转)
  • linux 下oracle提示:the account is locked
  • CentOS中无法使用setup命令 -bash:setup: command not found
  • java InputStream读取数据问题
  • CITRIX 官方说明文档xenserver
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Python语法速览与机器学习开发环境搭建
  • Redis学习笔记 - pipline(流水线、管道)
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue2.0项目引入element-ui
  • 爱情 北京女病人
  • 从零搭建Koa2 Server
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 使用Swoole加速Laravel(正式环境中)
  • 使用权重正则化较少模型过拟合
  • 数组的操作
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #Lua:Lua调用C++生成的DLL库
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)SpringCloud 整合Python
  • (20050108)又读《平凡的世界》
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (五)关系数据库标准语言SQL
  • .naturalWidth 和naturalHeight属性,
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net面试题4
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @开发者,一文搞懂什么是 C# 计时器!
  • [20171106]配置客户端连接注意.txt
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [android] 请求码和结果码的作用
  • [autojs]逍遥模拟器和vscode对接
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [BZOJ1008][HNOI2008]越狱
  • [C/C++随笔] char与unsigned char区别
  • [COI2007] Sabor
  • [Contiki系列论文之2]WSN的自适应通信架构