你必须知道的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控制css中的float的代码
Aug 16 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
Apr 12 Javascript
JavaScript类属性的访问方式详解
Feb 11 Javascript
jQuery中attr()方法用法实例
Jan 05 Javascript
jQuery中的ajax async同步和异步详解
Sep 29 Javascript
javascript常用经典算法详解
Jan 11 Javascript
简单实现js进度条加载效果
Mar 25 Javascript
js原生日历的实例(推荐)
Oct 31 Javascript
原生js实现省市区三级联动代码分享
Feb 12 Javascript
javascript异步处理与Jquery deferred对象用法总结
Jun 04 jQuery
vue 微信扫码登录(自定义样式)
Jan 06 Javascript
浅析vue中的nextTick
Dec 28 Vue.js
你必须知道的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中Object对象的笔记分享
2011/06/28 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
Js动态创建div
2008/09/25 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
Python对列表中的各项进行关联详解
2017/08/15 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
浅谈django orm 优化
2018/08/18 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
高级销售员求职信
2013/10/25 职场文书
个人工作主要事迹
2014/05/08 职场文书
派出所所长先进事迹
2014/05/19 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
获奖感言一句话
2015/07/31 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL