你必须知道的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文字滚动停顿效果代码
Jun 28 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
AngularJS ng-blur 指令详解及简单实例
Jul 30 Javascript
jquery select2的使用心得(推荐)
Dec 04 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
webpack进阶——缓存与独立打包的用法
Aug 02 Javascript
vue-cli + sass 的正确打开方式图文详解
Oct 27 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
Vue.directive 自定义指令的问题小结
Mar 04 Javascript
JavaScript中var、let、const区别浅析
Jun 24 Javascript
实例讲解JavaScript 计时事件
Jul 04 Javascript
JS实现简单九宫格抽奖
Jun 28 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
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
Yii rules常用规则示例
2016/03/15 PHP
tagName的使用,留一笔
2006/06/26 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
几个常见的软件测试问题
2016/09/07 面试题
中式餐厅创业计划书范文
2014/01/23 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
奖励申请报告范文
2015/05/15 职场文书
信用卡催款律师函
2015/05/27 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server