你必须知道的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
js性能优化 如何更快速加载你的JavaScript页面
Mar 17 Javascript
javascript中this的四种用法
May 11 Javascript
jQuery横向擦除焦点图特效代码分享
Sep 06 Javascript
JS for...in 遍历语句用法实例分析
Aug 24 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
Layui 数据表格批量删除和多条件搜索的实例
Sep 04 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
Feb 11 Javascript
小程序跳转H5页面的方法步骤
Mar 06 Javascript
Node实现搜索框进行模糊查询
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简介
2006/10/09 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
色戒观后感
2015/06/12 职场文书
行政复议决定书
2015/06/24 职场文书
思想品德课教学反思
2016/02/24 职场文书
安全生产协议书
2016/03/22 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA