浅谈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 相关文章推荐
Array.slice()与Array.splice()的返回值类型
Oct 09 Javascript
用js实现随机返回数组的一个元素
Aug 13 Javascript
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
JS画线(实例代码)
Nov 20 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
正则表达式优化JSON字符串的技巧
Dec 24 Javascript
Bootstrap3制作自己的导航栏
May 12 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 Javascript
JavaScript中this函数使用实例解析
Feb 21 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 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之数组学习
2011/05/29 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
jQuery的一些注意
2006/12/06 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
全面理解闭包机制
2016/07/11 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
javascript实现简易计算器
2017/02/01 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
高一数学教学反思
2014/02/07 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
英雄儿女观后感
2015/06/09 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
银行求职信范文
2019/05/13 职场文书