浅谈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 相关文章推荐
node.js中的fs.truncate方法使用说明
Dec 15 Javascript
AngularJS学习笔记之TodoMVC的分析
Feb 22 Javascript
javascript解析xml实现省市县三级联动的方法
Jul 25 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
Dec 24 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
jQuery树形控件zTree使用小结
Aug 02 Javascript
JavaScript原生节点操作小结
Jan 17 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
JavaScript单线程和任务队列原理解析
Feb 04 Javascript
JSONP解决JS跨域问题的实现
May 25 Javascript
TS 类型兼容教程示例详解
Sep 23 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基于CURL进行POST数据上传实例
2014/11/10 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
js实现微信聊天效果
2020/08/09 Javascript
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
关于python3中setup.py小概念解析
2019/08/22 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
python中有关时间日期格式转换问题
2019/12/25 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
在keras里实现自定义上采样层
2020/06/28 Python
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
自荐书范文
2013/12/08 职场文书
火锅店营销方案
2014/02/26 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
流动人口婚育证明
2014/10/19 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
创业计划书之酒店
2019/08/30 职场文书
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python