简单通过settimeout看javascript的运行机制


Posted in Javascript onMay 10, 2019

前言

我们知道JS是一个单线程的语言,而且其运行机制比较特殊。

下面我们通过settimeout的几个示例来展现javascript的运行机制的特殊点

示例1

console.log(1);
setTimeout(function(){
 console.log(2);
},0);
console.log(3);
// 打印出 1 3 2

示例2

console.log('1');
setTimeout(function(){
 console.log('2');
},0);
while(1){}
// 打印出1,然后浏览器卡死,不会打印出2

javascript会先把需要运行的内容放到任务队列中

但是如果遇到settimeout,会认为这是个异步任务,会先放到异步队列中

浏览器会先执行同步任务,等到同步任务执行完之后,再查看异步队列

如果异步队列中的任务的执行时机到了,浏览器就会把任务放到同步队列中去。

即:

异步任务一定在同步任务之后执行。

示例3

for(var i = 0; i < 4; i++){
 setTimeout(function() {
  console.log(i);
 }, 1000);
}
// 打印 4 4 4 4

为什么打印出的是4 4 4 4呢?

因为浏览器会先执行for循环

每执行一次for循环,都把一个settimeout压入异步队列

1000毫秒之后,执行settimeout里的方法的时候,i的值已经是4了。

如果要打印0 1 2 3怎么办呢?

利用闭包的特性,把i缓存到一个temp值里

for(var i = 0; i < 4; i++){
 (function(temp){
  setTimeout(function() {
   console.log(temp);
  }, 1000);
 })(i);
}
// 打印 0 1 2 3

这样做等于是每一次for循环都新建了一个匿名函数,i的值被存入了这个匿名函数的内存里。

理解了闭包的同学一定可以理解这一点。

示例4

我们知道ES6引入了新的关键字let

在这里,let有一个新的特性

for(let i = 0; i < 4; i ++){
 setTimeout(function(){
  console.log(i); 
 }, 1000);
}
// 打印 0 1 2 3

示例4与示例3只有var和let这个地方有区别,但是打印出来的结果却完全不同

这是因为let是一个块级作用域

let定义的i,对于每一个for循环的执行来说都是一个全新的i(使用不同的内存地址)

所以打印的时候可以得到0 1 2 3

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript延迟加载
Mar 09 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
Sep 11 Javascript
javascript强制点击广告的方法
Feb 06 Javascript
详述JavaScript实现继承的几种方式(推荐)
Mar 22 Javascript
javascript回到顶部特效
Jul 30 Javascript
js H5 canvas投篮小游戏
Aug 18 Javascript
前端js弹出框组件使用方法
Aug 24 Javascript
AngularJS中run方法的巧妙运用
Jan 04 Javascript
js仿QQ邮箱收件人选择与搜索功能
Feb 10 Javascript
全面解析Node.js 8 重要功能和修复
Jun 02 Javascript
详解js实时获取并显示当前时间的方法
May 10 #Javascript
JS获取本地地址及天气的方法实例小结
May 10 #Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
May 10 #Javascript
vue无限轮播插件代码实例
May 10 #Javascript
js中的深浅拷贝问题简析
May 10 #Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
May 10 #Javascript
详解jQuery如何实现模糊搜索
May 10 #jQuery
You might like
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
Javascript typeof 用法
2008/12/28 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
python如何实现word批量转HTML
2020/09/30 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
初中生自我鉴定
2014/02/04 职场文书
推荐信格式要求
2014/05/09 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
家庭教育的心得体会
2014/09/01 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
银行贷款收入证明
2014/10/17 职场文书
保密工作整改报告
2014/11/06 职场文书
《鲸》教学反思
2016/02/23 职场文书
Python字符串的转义字符
2022/04/07 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技