你必须知道的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自带函数备忘 数组
Dec 29 Javascript
js 新浪的一个图片播放图片轮换效果代码
Jul 15 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
May 26 Javascript
JS拖动技术 关于setCapture使用
Dec 09 Javascript
jquery 插件学习(二)
Aug 06 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
Nov 26 Javascript
jQuery+json实现动态创建复杂表格table的方法
Oct 25 Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
Jun 11 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
Jul 03 Javascript
原生JS运动实现轮播图
Jan 02 Javascript
js实现碰撞检测
Jan 29 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
纯php生成随机密码
2015/10/30 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
详解vue路由
2020/08/05 Javascript
python实现360的字符显示界面
2014/02/21 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
Python最小二乘法矩阵
2019/01/02 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
实现向右循环移位
2014/07/31 面试题
结构工程研究生求职信
2013/10/13 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
铣工实训报告
2014/11/05 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python
golang实现浏览器导出excel文件功能
2022/03/25 Golang