简单通过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学习笔记之获取当前目录的实现代码
Dec 14 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
Dec 27 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
Mar 18 Javascript
js小数运算出现多位小数如何解决
Oct 08 Javascript
jquery属性,遍历,HTML操作方法详解
Sep 17 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
详解Jquery Easyui的验证扩展
Jan 09 Javascript
canvas实现钟表效果
Feb 13 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
详解vue 实例方法和数据
Oct 23 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
详解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
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
第五节--克隆
2006/11/16 PHP
php绘制一个扇形的方法
2015/01/24 PHP
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JS中操作JSON总结
2020/12/06 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
JavaScript中Array方法你该知道的正确打开方法
2018/09/11 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
详解Vue之事件处理
2020/07/10 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
在Python中marshal对象序列化的相关知识
2015/07/01 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
python实现自动解数独小程序
2019/01/21 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
任意存:BOXFUL
2018/05/21 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
污水厂厂长岗位职责
2014/01/04 职场文书
环保建议书作文300字
2015/09/14 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
python爬取新闻门户网站的示例
2021/04/25 Python