你必须知道的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 相关文章推荐
JavaScript 计算图片加载数量的代码
Jan 01 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 Javascript
js中escape对应的C#解码函数 UrlDecode
Dec 16 Javascript
js正则匹配出所有图片及图片地址src的方法
Jun 08 Javascript
jquery实现简单实用的打分程序实例
Jul 23 Javascript
js实现文字滚动效果
Mar 03 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 Javascript
Angular Renderer (渲染器)的具体使用
May 03 Javascript
解决linux下node.js全局模块找不到的问题
May 15 Javascript
vue 动态表单开发方法案例详解
Dec 02 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
Sep 22 Javascript
jQuery实现简单弹幕制作
Dec 10 jQuery
你必须知道的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生成html文件方法总结
2014/12/01 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
php中this关键字用法分析
2016/12/07 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
python抓取网页中图片并保存到本地
2015/12/01 Python
利用Python如何生成随机密码
2016/04/20 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
电子商务应届生自我鉴定
2014/01/13 职场文书
公司委托书怎么写
2014/08/02 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
励志演讲稿500字
2014/08/21 职场文书
同学会邀请函模板
2015/01/30 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
Java 死锁解决方案
2022/05/11 Java/Android