本篇主要内容:异步、定时器引发的思考

预计阅读时间:8分钟

了解

我们都知道在js中定时器有两种  setInterval()  、 setTimeout()  
setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。方法会不停地调用函数,直到  clearInterval()  被调用或窗口被关闭。 
setTimeout() :在指定的毫秒数后调用函数或计算表达式。 
那么问题来了,定时器真的是定时执行的吗? 刚开始我认为定时器肯定是定时执行的啊,要不然怎么会叫做定时器呢,后来我感觉我好像错了,所以今天就来说说这个问题 定时器真的是定时执行的吗


测试

1 var start = Date.now()
2 console.log('启动定时器前...')
3 setTimeout(function () {
4    console.log('定时器执行了: ', Date.now()-start)
5 }, 100)
6 console.log('启动定时器后...');

我们会发现定时器执行了101ms, 一般会延迟一丁点(可以接受),说白了就是准确的,如果说300ms之后执行呢?

var start = Date.now()
console.log('启动定时器前...')
setTimeout(function () {console.log('定时器执行了: ', Date.now()-start)
}, 100)
console.log('启动定时器后...');
for (var i = 0; i < 1000000000; i++) {}

如果像上边这种情况,本来是200ms,但是现在变成了1941ms,那还合适吗? 
也就是说我们的定时器真的能保证定时吗? 
答案是不能,也可能延迟执行,是在原有设定的时间上又有延迟,加入本来是200ms, 那么现在是1941ms,所以说定时器并不能真正保证定时执行

注意:定时器的回调函数是在主线程执行,无论是非回调函数还是回调函数都是在主线程执行


JS执行方式

这时候就说到了一个概念 --- js是单线程执行的 
那如何证明js执行是单线程的呢?尤其是一些回调函数中,我们把握不住是主线程执行还是分线程执行的,所以我们现在就验证下js是单线程执行的

setTimeout(function () {console.log('timeout 2')
}, 2000)setTimeout(function () {console.log('timeout 1')
}, 1000)
function fn () {console.log('fn()');
}
fn()
console.log('alert之前')
alert('提示...')
console.log('alert之后')

执行流程:fn() alert之前 弹窗

当我点击确认后,  timeout 2  和  timeout 1  是立即执行还是过一会执行

alert之后 timeout 1 timeout 2

我们发现是过一会执行,所以说  alert() 的作用是暂停当前主线程,同时暂停计时。 点击确认后,回复程序执行和计时

小结 
如何证明js执行是单线程的? 
setTimeout()  的回调函数是在主线程执行的 
定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行

setTimeout(function () {alert('2222222')console.log('timeout 2')
}, 2000)setTimeout(function () {alert('1111111')console.log('timeout 1')
}, 1000)
function fn () {console.log('fn()');
}
fn()
console.log('alert之前')
alert('提示...')
console.log('alert之后')

其实呢到现在咱们也不能清楚地看到JS是如何执行的,要说到这个,我们就得说下代码分类,之前也写过代码分类,全局代码和函数局部代码。

代码分类

这一次呢我们分为初始化代码和回调代码 
回调代码就是回调函数中的代码

setTimeout  是本文的初始代码

接下来就是比较重要的一段函数了

setTimeout(function () {console.log('timeout 0')
}, 0)
console.log('昼猫')

这一段代码中是谁先执行?

总结

JS引擎执行代码的基本流程: 
先执行初始化代码:包含一些特别的代码,例如:设置定时器、绑定事件监听、发送ajax请求 
在后面在某个时刻才会执行回调代码 
回调函数我们平常时候会说是异步执行 
也就是说某些代码(某些东西)必须在所有的初始化代码执行后才有可能得到被执行,这样的代码我们成为异步代码

 孔子东游记               公众号:昼猫笔记

文章转载公众号昼猫笔记

转载于:https://www.cnblogs.com/zhoumao/p/10098780.html

昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?相关推荐

  1. 昼猫笔记 JavaScript -- 闭包

      本次主要内容是 闭包 阅读时间: 约 3分钟 记得点个赞支持支持我哦 初步了解 先看下代码,输出结果是多少? 1 function fn1 () { 2 var a = 2 3 function ...

  2. 昼猫笔记 从此告别复杂代码--JavaScript

    昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 大家好,我是一只来自喵星的前端初学者,由于我们喵星人科技较为落后,昼猫从今天开始带着使命来到地球学习前端知识. 从今天开始,猫猫我就从Jav ...

  3. javascript实现毫秒级精准定时执行函数

    由于javascript 的 setTimeout 会因为事件循环问题导致不精准,有偏差 这里实现了一个精准的定时执行函数 原理: 每隔时间的一半,重新设置定时器,时间继续切分一半,相当于重新校准偏差 ...

  4. python定时任务,隔月执行,隔定时执行

    #BlockingScheduler定时任务 from apscheduler.schedulers.blocking import BlockingScheduler from datetime i ...

  5. mac定时执行python_mac下定时执行python程序(附不执行解决方案).md

    需要用到:定时任务crontab和vi编辑器以及finder获取文件的路径 finder显示完整路径,后面用到 image.png 如图的设置,在命令行输入下面的代码: defaults write ...

  6. 毫秒级精度计划任务管理、系统运维管理、定时执行任务、定时任务执行、任务定时执行软件 —— 定时执行专家

    目录 一.使用教程 1.软件下载 2.软件的安装方法 3.软件第一次运行,选择界面语言 4.设置软件开机启动,自动运行.自动隐藏(自动隐身运行) 二.软件简介 1.支持 23 种任务类型 2.支持 1 ...

  7. 定时执行任务工具 - 定时执行专家

    使用教程 1.软件下载 TimingExecutor-V5.5-210516.zip 链接:https://pan.baidu.com/s/1fVSpzrdeyGZwtm2Ae3owYA 提取码:bo ...

  8. 定时执行小工具 - 定时执行专家

    使用教程 1.软件下载 TimingExecutor-V5.5-210516.zip 链接:https://pan.baidu.com/s/1fVSpzrdeyGZwtm2Ae3owYA 提取码:bo ...

  9. python定时执行函数_python定时执行详解

    知识点 1. sched模块,准确的说,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度. (1)生成调度器: s = sched.scheduler(time.time,tim ...

最新文章

  1. 抖音日活用户破 6 亿,推荐系统到底有何魔力?
  2. linear-gradient 百分比以及斜角的使用
  3. MySQL 数据库linux系统下修改配置文件设置mysql是否大小写敏感实例演示
  4. ui与html界面区别,ui前端和web前端的区别是什么?
  5. style对象的cssText方法
  6. 外设驱动库开发笔记20:BME280压力湿度温度传感器驱动
  7. LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)
  8. (libgdx学习)GestureDetector
  9. 基于FPGA的冗余链路高速切换解决方案
  10. linux学习书籍汇总 值得推荐的linux学习书籍
  11. Intent intent =new Intent(getActivity(),DeliverListActivity.class,Cannot resolve method'getActivity'
  12. 他山之石 | 微信搜一搜中的智能问答技术
  13. rm -rf 命令 与正则表达式
  14. 周信东c语言实验二实验报告,实验三 循环结构程序设计参考答案
  15. 经典排序算法学习笔记二——快速排序
  16. 在云端管理您的所有身份(AAD)-第一部分
  17. 【人工智能】人工智能学习常用社区
  18. HanLP汉语言分析框架
  19. Nova Suspend 和 Pause
  20. HTML输入标签 input —— 文本框

热门文章

  1. python散点图拟合曲线-Python解决最小二乘法拟合并绘制散点图
  2. python 书 推荐-推荐几本Python书
  3. python和java哪个-Python与Java-你首选哪个?
  4. 学python就业要看哪些书-学习Python适合就业哪些岗位?老男孩Python学习
  5. python 代码-代码的重试机制(python简单实现)
  6. python零基础怎么学-零基础如何入门Python
  7. python入门基础代码图-Python Matplotlib绘图基础知识代码解析
  8. python可以用来做什么-Python 学会之后可以用来干嘛的?
  9. python运行慢-提高python运行速度的几个技巧
  10. 题目1015:还是A+B