码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 前端开发核心知识进阶 setTime相关考察


    前端开发核心知识进阶 setTime相关考察

    从代码开始分析,请观察以下代码

    setTimeout(() => {
    	console.log('setTimeout block')
    },100)
    while(true){
    
    }
    console.log('end here')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    执行以上代码不会得到任何的输出,这是因为,while(true){}一直在循环,主线程被占用,无法运行下面的代码

    setTimeout(() => {
    	while(true){
    	}
    },0)
    console.log('end here')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这段代码回打印end here

    同步任务与异步任务

    • 同步任务:当前主线程将要消化执行的任务,这些任务一起形成执行栈
    • 异步任务:不进入主线程,而是进入任务队列,即不会马上执行的任务

    当同步任务全被消化后,主线程空闲时,即上面提到的执行栈为空时,系统将会执行任务队列的任务,即异步任务

    这样的机制保证了:虽然JavaScript是单线程的,但是对于一些耗时的任务,我们将其丢入任务队列中,这样就不会妨碍其他同步代码的执行,等到异步任务完成后,便会及进行相关的操作

    定时器等待的时间与设置不符合

    const t1 = new Date()
    
    // 100ms的定时器
    setTimeout(() => {
    	const t3 = new Date()
    	console.log('setTimeout block')
    	console.lo('t3-t1',t3-t1)
    },100)
    
    let t2 = new Date()
    
    while(t2-t1 < 200){
    	t2 = new Date()
    }
    
    console.log('end here')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出:

    end here
    setTimeout block
    t3-t1,200

    我们可以看到,虽然给定时器定的是100ms,但是因为同步任务中的while循环卡住。定时器只有在主线程的同步任务执行完后,才能执行,所以t3和t1的时间差为200ms,为不是设定的100ms

    最小延迟时间

    setTimeout(() => {
    	console.log('100')
    },100)
    
    setTimeout(() => {
    	console.log('0')
    },0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出;

    0
    100

    因为代码执行时第二个setTimeout的定时器函数将更快被触发,所以会先输出0,再输出
    100

    但是将代码修改成一面的样子,情况就不一样了

    setTimeout(() => {
    	console.log('1')
    },1)
    
    setTimeout(() => {
    	console.log('0')
    },0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出:

    1
    0
    这是因为1ms与0ms的延迟是等价的,此时,谁的代码顺序靠前,谁就会再主线程空闲时优先被执行,

  • 相关阅读:
    卡尔曼滤波之二:Python实现
    【负荷预测】基于自适应灰狼算法(IGWO)改进LSSVM实现负荷预测附Matlab代码
    由于找不到d3dx9_43.dll,无法继续执行代码要怎么解决
    LeetCode(30)长度最小的子数组【滑动窗口】【中等】
    C/C++实现:使用单向循环链表实现:编写相关函数来完成两个超长正整数的加法 某知名公司笔试题
    一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
    pcl--第五节 点云表面法线估算
    iMazing2024年最新许可证-iMazing许可证激活补丁
    如何组装一个注册中心?
    蓝桥杯每日一题(python)
  • 原文地址:https://blog.csdn.net/qq_56303170/article/details/127542714
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号