聊一下JavaScript定时器
话说JS的定时器,常用的其实就是setTimeout和setInterval这二个。它们俩一个是运行一次就拉倒,另一个是你不叫我停我就一直跑,正好相反。这两货用不好其实挺坑的,主要是因为JS是单线程的,同一时间只能干一个事,切菜的时候,就不能把锅先放灶上,必须一个一个。就好比上厕所先大便完了,收拾好了出来,再转身进去小便。。。^_^哈哈哈,没办法
后来为了效率吧,就基于事件响应引用了异步的概念。就是主线程切菜呢,热锅这事先放在任务队列里,等切完菜了,再问问任务队列里有事没?有就将之加入主线程,来回这么折腾。
说这么半天是为什么呢?主要还是想表示说,定时器也是一个异步任务。一般正常浏览器吧都有一个定时器模块,这个延迟时间之类的就是它来管。一但任务队列里轮到它了,它就进入主线程了。但因为JS是单线程的嘛,就是setTimeout(funct..(),n),n秒之后执行,这个n啊,如果是一个定时器还OK。如果你页面上有多个定时器,然后你之前的还没及时清除,那你就来吧,多个定时器就互相干扰。这个场景太美,我就不用语言描述了,你多搞几个setTimeout之类的自己体会下吧。
setTimeout互相干扰的大概原理吧,就是setTimeout(func..., n),是说n秒之后就把func函数加入主线程开始执行。但如果在它之前的那个程序特别大或慢,那按正理得等前面那个任务把事办完才行。但如果定时器之前的这个任务特别慢,超级慢,,,用了一分钟才完事。那你如果定时是5秒之后执行fn函数的话,事实上也许将要等一分钟
如果是setInterval呢,那就更坑,坑的n次方。为什么呢?首先setInterval就是重复执行的,你不说停我不停的这种。其次,setInterval(fnuc,100),你以为是func执行完之后间隔100再执行下一次?图样啊,这货根本不管你上次是否执行完成!来吧哥们,它其实是每100ms就放一个任务到主线程执行一次。就好比,你每天切100棵大白菜,你以为是切完1棵之后,过100ms再切下一棵。NO,其实是不管你这棵切完没有,它都是100ms之后,再扔一棵白菜给你。你切完OK,没切完?二棵大白菜一块剁吧。。你想想,这不要命么,乱了套了。
所以setInterval和setTimeout,使用它们的时候,给个变量,用完就删除,一了百了最好了。
就这样,
var iID=setInterval(fn, 500);
//执行一堆事之后
clearInterval(iID);//清除
你如果想知道,setInterval和setTimeout一块用了会怎么样?
JS会说,我先遇上哪个就先干哪个。
- re模块(正则表达式)
- Python学习——collections系列
- 为stackGan一个工程创建一个虚拟环境,python 2.7 tensorflow0.12-tensorflow 1.01
- linux 普通操作,查看资源使用情况
- Python 函数使用记录,join函数和os.path.join用法
- 01.SQLServer性能优化之----强大的文件组----分盘存储
- stackGan实验
- pyTorch基础入门练习
- 昨天遇到的几个常用函数
- 【深入浅出】一篇超棒的机器学习入门文章
- .NET中的异步编程上
- 从python2到python3
- 【干货】如何写代码 -编程内功心法
- .NET中的异步编程下
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法