zoukankan      html  css  js  c++  java
  • 关于js的setTimeout和setInterval

    刷微博,看到MR梁广彬 的微薄 “alert("1");setTimeout(function(){},5000);alert("2"); JS是异步执行的,我想"2"延迟出现有办法么?但我又不想把alert("2");扔进函数里面,呵呵!只是想理解探讨下!网上找了很多资料都找不到”


    发现以前自己想问题都不深入,好像也没去认真想过setTimeout和setInterval这两个函数

    做了个小测试

    setTimeout(function(){console.log("0")},0);
    console.log("1");
    setTimeout(function(){console.log("2")},3000);
    setTimeout(function(){console.log("3")},1000);
    setInterval(function(){console.log("4")},2000);
    console.log("5");

    输出结果

    1 
    5
    0 3 4 2 4

    第一行代码,虽然定时器为0ms,但是呢,它还是在1跟5之后才输出(ps:为什么?)

    上网看到有一篇文章写得挺好的,好好看看看:http://www.laruence.com/2009/09/23/1089.html

    这篇文章一开始看到我很纠结,看了几次,后来通过与MR梁广彬的一起纠结,终于发现有点明白了,用自己的话做的总结:

    Javascript引擎是单线程的,真的单线程,然后,它有一个任务列表,js引擎从任务列表里面取任务出来执行,任务列表的一开始放着的是当前所在函数块,js处理着当前函数块,当遇到setTimeout跟setInterval的时候的时候,此时有浏览器的一个 定时计数器 出来工作了(注意,定时计数器不是js引擎的,,是浏览器的),所以,js引擎始终都是单线程,定时器工作,时间到就触发事件,事件放到任务列表里面,等待js引擎处理完前面的工作(ps:这就解决了上面的疑问,虽然触发时间为0ms,但是由于它是由定时器触发的,所以它在任务列表里面的位置是在原先所在函数块的后面,js引擎先处理完函数块的工作才来处理触发事件),所以,如果有两个任务的触发时间虽然相差很短,但是只要前一个任务还没执行完,就永远轮不到下一个,即使他们的触发时间相差几毫秒,事实上事件的实现可能会差几百毫秒,这就看前一个任务的执行时间了。。

    JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.

    JavaScript引擎用单线程运行也是有意义的,单线程不必理会线程同步这些复杂的问题,问题得到简化.

     

     

     

  • 相关阅读:
    场景法设计测试用例
    编写边界条件测试用例原则
    CSS
    JavaScript
    HTML
    lamp安装教程
    Linux(lamp安装)
    oracle sqlplus常用命令
    利用同步器实现互斥锁
    工厂模式--简单工厂模式
  • 原文地址:https://www.cnblogs.com/zhrj000/p/2730565.html
Copyright © 2011-2022 走看看