JavaScript setTimeout 延迟不准 原理和解决方法详解

1. 最基础的误解:setTimeout(fn, 1000) 不等于“1秒后准时执行”

别被参数名字骗了。setTimeout 的真实意思是:“至少等1000毫秒后,把这个函数 fn 放进一个待办事项列表(任务队列)里排队。等当前手头所有活儿都干完了,再轮到它执行。”

看个简单例子就懂了:

console.log("开始");
setTimeout(() => { console.log("定时器到了!"); }, 0); // 延迟设为0
console.log("结束");

    输出顺序是:

    开始
    结束
    定时器到了!

      为什么 0 秒延迟也没立刻执行?因为 setTimeout 的回调函数(就是那个打印“定时器到了!”的函数)被放进队列后,必须等到当前正在跑的代码(就是打印“开始”和“结束”的那段)全部执行完毕,主线程闲下来了,才会去队列里把它拿出来执行。即使延迟是0,也要排队。

      2. 主线程忙不过来,定时器就得一直等(延迟漂移)

      JavaScript 在一个线程里干活(单线程)。如果这个线程被其他事情卡住了,setTimeout 设定的时间到了也没用,回调函数只能在队列里干等着。

      看这个例子:

      console.log("开始");
      
      setTimeout(() => { console.log("Timeout!"); }, 1000); 
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包

      打赏作者

      奔向理想的星辰大海

      你的鼓励将是我创作的最大动力

      ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
      扫码支付:¥1
      获取中
      扫码支付

      您的余额不足,请更换扫码支付或充值

      打赏作者

      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值