• JavaScript相关面试题:setTimeout的运行机制



    setTimeout简介

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行。它返回一个整数,表示定时器timer的编号,可以用来取消该定时器。

    console.log(1);
    setTimeout(function () {
        console.log(2);
    }, 0);
    console.log(3)
    
    //1 3 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    无论setTimeout的执行时间是0还是1000,结果都是先输出3后输出2,这就是面试官常常考查的js运行机制的问题

    JavaScript 单线程

    JavasScript引擎是基于事件驱动和单线程执行的,JS引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS线程在运行程序,即主线程。那么单线程的JavasScript是怎么实现“非阻塞执行”呢?是通过任务队列。

    所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

    单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。但是如果有些任务很慢时(比如Ajax操作从网络读取数据),我还是要等结果在执行后一个任务吗?于是,有了一种异步任务。

    同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;而异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有主线程执行完毕,主线程去通知"任务队列",某个异步任务可以执行了,该任务才会进入主线程执行。

    ★所有同步任务都在主线程上执行,形成一个执行栈(Call Stack)
    ★主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件
    ★一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
    ★主线程不断重复上面的第三步

    setTimeout运行机制

    setTimeout 和 setInterval的运行机制,其实就是将指定的代码移出本次执行,等到下一轮 Event Loop 时,再检查是否到了指定时间。如果到了,就执行对应的代码;如果不到,就等到再下一轮 Event Loop 时重新判断。
    这意味着,setTimeout指定的代码,必须等到本次执行的所有同步代码都执行完,才会执行。

  • 相关阅读:
    SpringBoot+Vue实现前后端的高校失物招领系统
    基于SSM的员工信息管理系统设计与实现
    金融业信贷风控算法1-初等概率论
    window mysql-5.7.43 zip解压包安装
    Jenkins
    Qt Designer生成ui文件,如何转py文件,如何运行
    俄罗斯方块游戏开发教程8:下落处理
    双因子认证是什么? 安当加密
    近视是怎样形成的?
    基于深度学习的车牌+车辆识别(YOLOv5和CNN)
  • 原文地址:https://blog.csdn.net/xiaolu567/article/details/126257849