浅谈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 相关文章推荐
Js四则运算函数代码
Jul 21 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
Apr 02 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
Jul 28 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 Javascript
javaScript中with函数用法实例分析
Jun 08 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
layui实现table加载的示例代码
Aug 14 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 Javascript
Javascript如何实现双指控制图片功能
Feb 25 Javascript
js 数据类型判断的方法
Dec 03 Javascript
7个你应该知道的JS原生错误类型
Apr 29 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
win7安装python生成随机数代码分享
2013/12/27 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
python实现分页效果
2017/10/25 Python
快速了解Python相对导入
2018/01/12 Python
python 编码规范整理
2018/05/05 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
python实现随机加减法生成器
2020/02/24 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
稽核岗位职责范本
2015/04/13 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书