你必须知道的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 相关文章推荐
利用jq让你的div居中的好方法分享
Nov 21 Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 Javascript
JS Canvas定时器模拟动态加载动画
Sep 17 Javascript
Vue.js创建Calendar日历效果
Nov 03 Javascript
jquery滚动条插件(可以自定义)
Dec 11 Javascript
vue.js学习笔记:如何加载本地json文件
Jan 17 Javascript
vue-router 学习快速入门
Mar 01 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
vue自定义表单生成器form-create使用详解
Jul 19 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
Sep 20 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 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
加强版phplib的DB类
2008/03/31 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP查询网站的PR值
2013/10/30 PHP
php检测useragent版本示例
2014/03/24 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
Python正则表达式指南 推荐
2018/10/09 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
详解Flask前后端分离项目案例
2020/07/24 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
建筑设计师岗位职责
2013/11/18 职场文书
普通院校学生的自荐信
2013/11/27 职场文书
中学运动会广播稿
2014/01/19 职场文书
平安建设工作方案
2014/06/02 职场文书
企业消防安全责任书
2014/07/23 职场文书
第一节英语课开场白
2015/06/01 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
SQL Server内存机制浅探
2022/04/06 SQL Server