返回顶部
首页 > 资讯 > 前端开发 > VUE >如何理解JavaScript单线程及setTimeout定时器
  • 271
分享到

如何理解JavaScript单线程及setTimeout定时器

2024-04-02 19:04:59 271人浏览 安东尼
摘要

如何理解javascript单线程及setTimeout定时器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。理解JavaScript的单线

如何理解javascript线程及setTimeout定时器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

理解JavaScript的单线程的理念对于JavaScript学习,以及掌握其中的一些设计机制非常重要,比如回调、定时器。对于后续学习nodejs也有很大的帮助。

通过先demo,后总结的形式,使得JavaScript的单线程更易于明白。

1 var a = 1;  //全局变量a 2 function test(){ 3     var a=2;  //test中变量a 4     setTimeout(function(){ 5         alert(a); //输出test中变量a 6         a=3;  //修改test中变量a 7     },3000); 8     a=4; //修改test中变量a 9     setTimeout(function(){ 10         alert(a); //输出test中变量a 11         a=5; //修改test中变量a 12    },1000); 13    alert(a); //输出test中变量a 14 } 15 test(); //执行test函数 16 alert(a); //输出全局变量a  //运行结果:4 1 4 5    

由此延伸以下代码:

var a = 1; var date = +new Date(); // 小技巧:通过"+"转换为整数 function test(){     var a=2;      setTimeout(function(){         console.log(a+'--'+ (new Date()-date));         a=3;        },3000);     a=4;     setTimeout(function(){         console.log(a+'--'+ (new Date()-date));         a=5;    },1000);    console.log(a+'--'+ (new Date()-date)); } while(new Date-date <1000){  } test(); console.log(a+'--'+ (new Date()-date));  //执行结果:4-1000 1-1001 4-2000 5-4001

结合以下博客,整理一些重要概念:

Http://www.ruanyifeng.com/blog/2014/10/event-loop.html

http://www.cnblogs.com/Mainz/p/3552717.html

1、作为脚本语言,JavaScript主要功能是与用户互动,以及操作DOM。假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?  ->So: JavaScript就是单线程。

2、JavaScript的任务分成两种:同步任务和异步任务。同步任务:在主线程上排队执行的任务,只有上一个任务执行完成了,才会执行下一个任务。异步任务:不进入主线程,而进入“任务队列”的任务,只有“任务队列”通知主线程,某个任务队列可以执行了,等主线程执行完成,任务队列才会进入主线程执行。  -> So:只要主线程空了,就会去读“任务队列”,这就是JavaScript的运行机制。

3、主线程从“任务队列”中读取事件,这个过程是循环不断的,所以整个事件又叫“事件循环”(Event Loop)。

HTML5规定setTimeout()的第二个参数的最小值(最短间隔),不得低于4ms,如果低于4ms就会自动增加。在此之前,老版本浏览的都将最短时间设置为10ms。另外,对于那些DOM变动(尤其是设计页面重新渲染的部分),通常不会立即执行,而是每16ms执行一次。这是使用requestAnimationFrame()的效果要好于setTimeout()。

4、需要注意的是:setTimeout只是将事件插入“事件队列”,必须等到前面代码(执行栈)执行完,主线程才会去执行他指定的回调函数。如果当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的是时间执行。

Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务:不进入主线程、而进入“任务队列”的任务。

js是单线程的,但是浏览器是多线程的!浏览器是事件驱动的!

JS运行在浏览器中,是单线程的,每个window一个JS线程,但是浏览器不是单线程。可能有多个如下线程:

Javascript引擎线程、界面渲染线程、浏览器事件触发线程、Http请求线程。

setTimeout可以改变,js执行顺序。比如:我们想要输出Hello World,world必须在hello之后输出,不管我们代码的顺序怎么样都输出同样的效果,这个时候就可以借助setTimeout。

//代码一 var date =  +new Date(); console.log('Hello',new Date()-date); setTimeout(function(){      console.log('world',new Date()-date); },500);  //代码二: var date =  +new Date(); setTimeout(function(){      console.log('World',new Date()-date); },500); console.log('Hello',new Date()-date);  //以上两个代码运行结果一样,结果都是:先输出Hello ,然后500ms之后输出World![实际运行:501ms]

浏览器中定时器也是一个线程!

Javscript是单线程的,ajax请求确实是异步的!原因是ajax请求的时候,是在浏览器的Http请求线程中执行的,执行之后的回调函数会放到Javascript线程中执行!

Summary:

Javascript是单线程的,浏览器是多线程的,浏览器的线程包括:JS引擎线程、界面渲染线程、浏览器事件线程、Http请求线程。不过不同的浏览器提供的线程是有区别的。一般JS引擎线程和界面渲染线程是互斥的,两个线程不能同时执行,否则,就会出现界面渲染线程和JS线程修改同一个DOM样式的矛盾问题!

关于如何理解JavaScript单线程及setTimeout定时器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网VUE频道了解更多相关知识。

--结束END--

本文标题: 如何理解JavaScript单线程及setTimeout定时器

本文链接: https://lsjlt.com/news/86141.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解JavaScript单线程及setTimeout定时器
    如何理解JavaScript单线程及setTimeout定时器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。理解JavaScript的单线...
    99+
    2024-04-02
  • JavaScript定时器setTimeout、setInterval使用详解
    定时器:按我个人理解来说就是固定某个时间后,时间到了,就提醒我时间到了。 程序中的定时器:相当于倒计时,也相当于计时器。作用是在设定的某个时间后,执行特定的方法。 我们先来了解一下s...
    99+
    2023-05-17
    定时器settimeout 定时器 setInterval js定时器代码
  • JavaScript中的单线程和异步该如何理解
    小编今天带大家了解JavaScript中的单线程和异步该如何理解,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“JavaScript中...
    99+
    2023-06-29
  • 如何解决vue项目开发中setTimeout等定时器的管理问题
    小编给大家分享一下如何解决vue项目开发中setTimeout等定时器的管理问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、问题来源。在项目中,我们经常有这样的需求,一个页面初始化后...
    99+
    2024-04-02
  • JavaScript的单线程怎么理解
    本文小编为大家详细介绍“JavaScript的单线程怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript的单线程怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2024-04-02
  • JavaScript定时器原理详解
    目录一、 setTimeout() 定时器二、停止 setTimeout() 定时器三、setInterval() 定时器四、清除setInterval() 定时器五、电子时钟案例前...
    99+
    2024-04-02
  • linux多线程定时器如何使用
    在Linux上使用多线程定时器,可以使用以下步骤:1. 包含必要的头文件:```c#include #include #includ...
    99+
    2023-10-09
    linux
  • Java多线程如何实现定时器
    这篇文章主要讲解了“Java多线程如何实现定时器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程如何实现定时器”吧!一. 定时器概述1. 什么是定时器定时器是一种实际开发中非常常...
    99+
    2023-07-05
  • Java多线程(单例模式,阻塞队列,定时器,线程池)详解
    目录1. 单例模式(singleton pattern)1.1 懒汉模式1.2 饿汉模式2 阻塞队列(blocking queue)2.1 阻塞队列2.2 生产者消费者模型2.3 标...
    99+
    2024-04-02
  • SpringBoot通过@Scheduled实现定时任务及单线程运行问题解决
    目录一、开启定时任务方法二、不同定时方式的解析1.fixedDelay和fixedRate,单位是毫秒,它们的区别就是:2.cron表达式:灵活三、实现定时任务四、解决定时任务单线程...
    99+
    2023-02-21
    springboot @scheduled实现定时任务 Springbootschedule单线程 springboot 定时任务
  • JavaScript如何实现定时器
    这篇文章给大家分享的是有关JavaScript如何实现定时器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。简单介绍在JavaScript中定时器有两个 setInterval() 与 setTimeout() 分...
    99+
    2023-06-25
  • Java多线程(单例模式,堵塞队列,定时器)详解
    目录一、单例模式饿汉模式懒汉模式懒汉模式 二、堵塞队列实现BlockingQueue三、定时器总结一、单例模式 单例模式是一种设计模式,针对一些特定的场景,研究出对应的解决方案,。...
    99+
    2024-04-02
  • 如何使用Qt实现线程与定时器
    这篇文章主要介绍如何使用Qt实现线程与定时器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、定时器QTimer类The QTimer class provides repetitive and single-sho...
    99+
    2023-06-26
  • 详解Python的多线程定时器threading.Timer
    threading.Timer 一次timer只生效一次,不会反复循环,如果实现循环触发,代码如下: import time import threading def createT...
    99+
    2024-04-02
  • javascript中如何取消定时器
    这篇文章主要为大家展示了“javascript中如何取消定时器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中如何取消定时器”这篇文章吧。&...
    99+
    2024-04-02
  • SpringBoot通过@Scheduled怎么实现定时任务及单线程运行
    这篇文章主要介绍“SpringBoot通过@Scheduled怎么实现定时任务及单线程运行”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot通过@Scheduled怎么实现定时任务及...
    99+
    2023-07-05
  • Java多线程案例之定时器详解
    目录一.什么是定时器二.标准库中的定时器(timer)2.1什么是定时器2.2定时器的使用三.实现定时器3.1什么是定时器3.2最终实现代码一.什么是定时器 定时器也是软件开发中的一...
    99+
    2022-11-13
    Java多线程 定时器 Java 定时器 Java 多线程
  • JavaScript 定时器关键点及使用场景解析
    目录正文关于计时器的关键点异步函数setTimeoutsetInterval区别使用场合总结正文 JavaScript 定时器是实现循环行为甚至触发延迟操作的好功能。无论有什么基于...
    99+
    2023-01-30
    JavaScript 定时器 JavaScript 定时器场景
  • javascript如何清除所有定时器
    小编给大家分享一下javascript如何清除所有定时器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • 详解Java如何关闭线程以及线程池
    目录前言1. 关闭线程1.1 volatile关键字1.2 intrrrupt()方法2.关闭线程池2.1 shutdownNow()方法2.2 shutdown()方法前言 这个问...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作