大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
目录
一、参数及介绍
setTimeOut
setTimeOut (fn, delayTime)
【功能】:在一定时间延迟之后开始执行一个给定的函数
【参数1】:fn将要执行的函数,函数类型或者字符串类型
【参数2】:delayTime要延迟的时间,Number类型,单位为毫秒
【返回】:一个id值
setInterval
setInterval (fn, interval)
【功能】:每隔时间段interval就调用fn一次
【参数1】: fn将要执行的函数,函数类型或者字符串类型
【参数2】: interval要延迟的时间,Number类型,单位为毫秒
【返回】:一个id值
二、工作原理
前言:JS是单线程运行的
因为 JS 是单线程的,在某一个特定时间点只能执行某一个特定的任务,所以会阻塞其它任务执行。对于耗时的任务(例如网络请求,I/O操作等),没有必要等待他们执行完后才继续后面的操作。在这些任务完成前,JavaScript 完全可以往下执行其他操作,当这些耗时的任务完成后则以回调的方式执行相应处理。这些就是 JavaScript 与生俱来的特性:异步与回调。
信息参考自:关于JavaScript单线程的一些事
setTimeOut
【工作原理】
- JS是单线程执行,当执行到setTimeOut代码时开始计时,在当到达间隔时间delayTime 之后,把回调函数fn放到
事件队列
。 - 真正的运行时间取决于主线程何时调用事件队列中fn。(当主线程空闲下来才会去事件队列取出fn函数执行)
运行到 setTimeOut(时间点)| delayTime(时间段) | 调用函数fn(时间点)| fn执行时段(时间段)
setInterval
【工作原理】:
在执行到 setInterval 代码时,会开始计时,到达间隔时间 interval 之后,将判断:目前有没有此定时器的实例?
- 如果没有,则将 fn 加入到事件队列中
- 如果有,那么不会将回调函数 fn 加入到事件队列中,防止之后连续调用 fn(即非定时调用)
弊端:导致一些间隔被跳过
情况一:fn运行时间 ≤ 时间间隔 ,即多数情况
情况二:fn运行时间 > 时间间隔 ,即一些异常情况
为什么会这样?
- JS 为单线程,在一个时间段内全力只作一件事。即执行函数 fn。
- 在 fn 运行的时,定时器没有能力终止其的运行
- 当
fn运行时间 > 时间间隔 interval
时,间隔时间到了,但是程序还没有执行完,那也要老老实实的等着函数执行完。
弊端?
- 实际间隔是fn运行的时间,并非设定的时间间隔 interval,时间不精确。
三、setTimeOut弥补setInterval的不足
setTimeout(function fn(){
// 1. 业务逻辑
console.log('Hi')
// 2. 链式调用
setTimeout(fn, interval);
}, interval);
- 链式调用 setTimeout()
- 每次函数执行的时候都会创建一个新的定时器。
- 第二个setTimeout()调用当前执行的函数,并为其设置另外一个定时器。
- 这样做的好处是,在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔。
- 而且,它可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。
四、本文参考文章
排名不分先后
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185720.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...