你必须知道的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 相关文章推荐
select组合框option的捕捉实例代码
Sep 30 Javascript
javascript 面向对象全新理练之原型继承
Dec 03 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 Javascript
$(document).ready(function() {})不执行初始化脚本
Jun 19 Javascript
javascript异步处理工作机制详解
Apr 13 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
把普通对象转换成json格式的对象的简单实例
Jul 04 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
AngularJS 模块化详解及实例代码
Sep 14 Javascript
微信小程序图片选择区域裁剪实现方法
Dec 02 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
E路文章系统PHP
2006/12/11 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
浅谈php://filter的妙用
2019/03/05 PHP
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Python中函数的返回值示例浅析
2019/08/28 Python
python小项目之五子棋游戏
2019/12/26 Python
python实现udp传输图片功能
2020/03/20 Python
Python持续监听文件变化代码实例
2020/07/22 Python
python3中数组逆序输出方法
2020/12/01 Python
活动邀请函范文
2014/01/19 职场文书
护理专业自荐信范文
2014/02/26 职场文书
行政监察建议书
2014/05/19 职场文书
党员承诺书格式
2014/05/21 职场文书
社区矫正工作方案
2014/06/04 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
小学生表扬稿范文
2015/05/05 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
员工安全责任协议书
2016/03/22 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL