你必须知道的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 相关文章推荐
js常用函数 不错
Sep 08 Javascript
dojo 之基础篇
Mar 24 Javascript
javascript 写类方式之四
Jul 05 Javascript
比Jquery的document.ready更快的方法
Apr 28 Javascript
js循环改变div颜色具体方法
Jun 25 Javascript
javascript面向对象之对象的深入理解
Jan 13 Javascript
JS实现在页面随时自定义背景颜色的方法
Feb 27 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
Nov 24 Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 Javascript
vue数据初始化initState的实例详解
Apr 11 Javascript
详解JavaScript 的执行机制
Sep 18 Javascript
js实现简单商品筛选功能
Feb 02 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
详谈PHP编码转换问题
2015/07/28 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
再谈JavaScript线程
2015/07/10 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
python实现自动网页截图并裁剪图片
2018/07/30 Python
python中pip的安装与使用教程
2018/08/10 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
大学生学习自我评价
2014/01/13 职场文书
军训学生自我鉴定
2014/02/12 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
考试保密承诺书
2014/08/30 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
加入学生会自荐书
2015/03/05 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书