浅谈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 相关文章推荐
javascript函数库-集合框架
Apr 27 Javascript
JSON.parse 解析字符串出错的解决方法
Jul 08 Javascript
JQuery解析HTML、JSON和XML实例详解
Mar 29 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
May 04 Javascript
javascript中cookie对象用法实例分析
Jan 30 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
js窗口震动小程序分享
Nov 28 Javascript
JavaScript实现弹窗效果代码分析
Mar 09 Javascript
vue2.0之多页面的开发的示例
Jan 30 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
微信小程序实现打卡签到页面
Sep 21 Javascript
Vue ​v-model相关知识总结
Jan 28 Vue.js
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
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
Adodb的十个实例(清晰版)
2006/12/31 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
给护士表扬信
2014/01/19 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
消防演习感想
2015/08/10 职场文书
四年级作文之植物
2019/09/20 职场文书