简单通过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 相关文章推荐
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
Apr 06 Javascript
处理及遍历XML文档DOM元素属性及方法整理
Aug 23 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
Jul 17 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
Angularjs 设置全局变量的方法总结
Oct 20 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
Vue安装浏览器开发工具的步骤详解
May 12 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 Javascript
js实现全选和全不选
Jul 28 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 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
PHP学习记录之数组函数
2018/06/01 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
jQuery示例收集
2010/11/05 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
python实现爬取图书封面
2018/07/05 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
高校教师自荐信范文
2014/03/13 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
大学生暑期实践报告
2015/07/13 职场文书
运动会广播稿50字
2015/08/19 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python