你必须知道的Javascript知识点之"单线程事件驱动"的使用


Posted in Javascript onApril 23, 2013
 var intervalBody = function(){
     console.log('interval');
 } var startInterval = function(){
     setInterval(intervalBody,1000);
 }
 var timeoutBody = function(){
     console.log('timeout');
 }
 var startTimeout = function(){
     setTimeout(timeoutBody,1000);
 }
 var sleep = function(second){
     var current = new Date().setSeconds(new Date().getSeconds() + second);
     while(new Date() < current){ }
 }
 startInterval();
 startTimeout();
 sleep(2);
 console.log('sleep once');
 sleep(2);
 console.log('sleep again');

执行结果

你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用

发生了什么事情

你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用

执行规则规则1

事件驱动的单线程模型,所有javascript的代码都在一个线程中执行,javascript线程从事件队列中一次取出一个事件进行执行。

规则2

宿主中除了javascript线程外,还有定时器线程(setInterval和setTimeout会触发这两个线程执行)、浏览器事件触发线程(这个线程会触发onclick、onmousemove和其它浏览器事件)、AJAX请求线程;所有这些线程触发的事件(回调)都会加入到事件队列的尾部。

规则3

当浏览器加载完html文档后,会将当前html的所有的js代码作为事件队列的第一个事件,其它线程触发的事件(回调)都会加入到事件队列的尾部。

你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用

规则4

setTimeout和setInterval中的回调的执行时间肯定是大于为其指定的秒数。

浏览器渲染线程

假如javascript执行线程执行了A事件,在A事件执行的过程中修改了DOM,这些DOM的修改不会立即反应到界面上,而是当A事件执行完毕后,javascript线程会被阻塞,这时浏览器渲染线程会渲染DOM的修改结果,等浏览器渲染线程执行完毕后,javascript线程才继续运行。

代码示例

var sleep = function(second){
     var current = new Date().setSeconds(new Date().getSeconds() + second);
     while(new Date() < current){ }
 } document.body.innerHTML = '段光伟';
 sleep(5);
Javascript 相关文章推荐
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
Jul 11 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
jQuery表格行上移下移和置顶的实现方法
Oct 08 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
angular-cli修改端口号【angular2】
Apr 19 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
Jun 20 Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 Javascript
jQuery无冲突模式详解
Jan 17 jQuery
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
Aug 04 Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 Javascript
React forwardRef的使用方法及注意点
Jun 13 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
Apr 23 #Javascript
jquery清空textarea等输入框实现代码
Apr 22 #Javascript
js计算精度问题小结
Apr 22 #Javascript
基于javascipt-dom编程 table对象的使用
Apr 22 #Javascript
用js实现小球的自由移动代码
Apr 22 #Javascript
jquery打开直接跳到网页最下面、最低端实现代码
Apr 22 #Javascript
防止浏览器记住用户名及密码的简单实用方法
Apr 22 #Javascript
You might like
基于文本的搜索
2006/10/09 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
javascript 写类方式之一
2009/07/05 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python模块文件结构代码详解
2018/02/03 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
JPA的特点
2014/10/25 面试题
交通专业个人自荐信格式
2013/09/23 职场文书
假日旅行社实习自我鉴定
2013/09/24 职场文书
大学生优秀的自我评价分享
2013/10/22 职场文书
面试后的感谢信范文
2014/02/01 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
保证书格式
2015/01/16 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
Flink 侧流输出源码示例解析
2022/09/23 Servers