你必须知道的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修改CSS属性的代码
May 06 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
javascript实现获取字符串hash值
May 10 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
Jquery使用小技巧汇总
Dec 29 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
bootstrap table表格插件使用详解
May 08 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
js实现搜索提示框效果
Sep 05 Javascript
JavaScript中document.activeELement焦点元素介绍
Nov 27 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.22配置php5.4(具体操作步骤)
2013/06/26 PHP
2014过年倒计时示例
2014/01/31 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python编程中类与类的关系详解
2019/08/08 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Python双链表原理与实现方法详解
2020/02/22 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
腾讯公司的一个sql题
2013/01/22 面试题
房屋公证委托书
2014/04/03 职场文书
就业协议书范本
2014/04/11 职场文书
五水共治一句话承诺
2014/05/30 职场文书
食品安全宣传标语
2014/06/07 职场文书
学校清明节活动总结
2014/07/04 职场文书
授权委托书
2014/09/17 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python