简单通过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 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
Jun 05 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
Dec 17 Javascript
Jquery 动态生成表格示例代码
Dec 24 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
Aug 24 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
Aug 31 Javascript
jQuery事件绑定用法详解
Sep 08 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
Dec 07 Javascript
vue中watch和computed的区别与使用方法
Aug 23 Javascript
JavaScript原始值与包装对象的详细介绍
May 11 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文本数据库的搜索方法
2006/10/09 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
Python中__init__和__new__的区别详解
2014/07/09 Python
Linux下Python获取IP地址的代码
2014/11/30 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
使用TensorFlow实现SVM
2018/09/06 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
Python多线程多进程实例对比解析
2020/03/12 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
2015年业务工作总结范文
2015/04/10 职场文书
开场白怎么写
2015/06/01 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技