浅谈Javascript线程及定时机制


Posted in Javascript onJuly 02, 2015

setTimeout、setInterval的使用

Javascript api文档中定义setTimeout和setInterval第二个参数意义分别为间隔多少毫秒后回调函数被执行和每隔多少毫秒回调函数被执行。但随着工作经验的积累,我们发现事实并非如此。

比如

div.onclick=function(){
  setTimeout(function(){
     document.getElementById('input').focus(); 
  },0);
}

就解释不通了,立即执行就立即执行呗,干嘛还要设置个定时兜个圈子呢。

又有一天你写了下面一段代码

setTimeout(function(){while(true){}},100);
setTimeout(function(){alert('你好');},200);

第一行代码死循环,结果造成第二行alert始终没有出现,为啥哩?

单线程or多线程?

原来,Javascript引擎是单线程运行的,浏览器只有一个线程在运行JavaScript程序。因为单线程的设计,所以免去了复杂的多线程同步问题。

当设置一个定时的时候,浏览器会在设定的时间后将你指定的回调函数插入任务序列,而非立即执行。如果设定定时时间为0,表示立即插入任务序列,而不是立即执行,仍然要等队列中任务执行完毕,轮到你,你才执行。

所以下面代码先弹出2,再弹出1

setTimeout(function(){
  alert(1);
},0);
alert(2);

那么,这又有什么实际用途呢?且看下面示例

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>setTimeout 0</title>
  </head>
  <body>
    输入字符,但内容却不能实时显示<input type="text" onkeydown="show(this.value)"/> <br/>
    输入字符,内容能实时显示<input type="text" onkeydown="var self=this;setTimeout(function(){show(self.value)},0)"/>
    <div></div>
    <script>
      function show(val){
        document.getElementsByTagName("div")[0].innerHTML=val;
      }
    </script>
  </body>
</html>

这个例子中,js引擎需要执行keydown事件处理程序,然后更新输入框的value值。事件处理程序执行时,更新value的任务只能进入队列等待,所以keydown事件执行时无法得到更新后的value值;但通过setTimeout我们把取value的操作放入队列,并在更新value之后执行,所以内容就能实时显示了。

再回来看看下面的代码:

setTimeout(function(){
  //do something...
   setTimeout(arguments.callee,10);
},10);

setInterval(function(){
  //do something...
},10);

      这两段代码看起来效果一样,是不是。其实还是有区别的,第一段的回调函数内的setTimeout是js引擎执行后再设定的新的定时,假定从上一个回调处理完到下一个回调开始为一个时间间隔,理论上时间间隔>=10ms,后一段代码<=10ms。

说到这儿,那XMLHttpRequest是不是真的异步呢?是的,请求是异步的,不过这请求是浏览器新开的一个线程。当请求的状态变更时,如果先前已设置回调,异步线程就将状态变更事件放入js引擎处理队列中等待处理,当任务被处理时js引擎始终还是单线程地执行onreadystatechange所设置的函数的。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
关于this和self的使用说明
Aug 01 Javascript
jQuery数据显示插件整合实现代码
Oct 24 Javascript
jQuery操作select的实例代码
Jun 14 Javascript
node.js Web应用框架Express入门指南
May 28 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
js实现简单随机抽奖的方法
Jan 27 Javascript
AngularJS基础知识笔记之表格
May 10 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
Backbone.js框架中简单的View视图编写学习笔记
Feb 14 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
在 Node.js 中使用 async 函数的方法
Nov 17 Javascript
elementUI同一页面展示多个Dialog的实现
Nov 19 Javascript
JavaScript获得url查询参数的方法
Jul 02 #Javascript
js跨域请求的5中解决方式
Jul 02 #Javascript
JS实现从连接中获取youtube的key实例
Jul 02 #Javascript
由ReactJS的Hello world说开来
Jul 02 #Javascript
深入理解JavaScript的React框架的原理
Jul 02 #Javascript
javascript实现简单的进度条
Jul 02 #Javascript
JavaScript实现添加、查找、删除元素
Jul 02 #Javascript
You might like
php MYSQL 数据备份类
2009/06/19 PHP
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
python判断字符串是否包含子字符串的方法
2015/03/24 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python实现的质因式分解算法示例
2018/05/03 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python定时任务sched模块用法示例
2018/07/16 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
通信工程毕业生求职信
2013/11/16 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
法人代表资格证明书
2015/06/18 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python