你必须知道的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 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
JQuery优缺点分析说明
Jun 09 Javascript
myeclipse安装jQuery插件的方法
Mar 29 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
详解Angular如何正确的操作DOM
Jul 06 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
Dec 03 Javascript
详解Element 指令clickoutside源码分析
Feb 15 Javascript
vue使用vuex实现首页导航切换不同路由的方法
May 08 Javascript
javascript中undefined的本质解析
Jul 31 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
javascript实现前端input密码输入强度验证
Jun 24 Javascript
如何基于viewport vm适配移动端页面
Nov 13 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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python实现购物车购物小程序
2018/04/18 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
python与js主要区别点总结
2020/09/13 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
2015年科研工作总结范文
2015/05/13 职场文书
亲戚关系证明
2015/06/24 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技