0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JAVASCRIPT与单个线程的工作

汽车玩家 ? 来源:今日头条 ? 作者:魏建民 ? 2020-05-05 22:07 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

事件循环是用来理解JavaScript的最重要的方面之一。这篇文章旨在解释JavaScript如何与单个线程一起工作的细节,以及它如何处理异步函数。

JavaScript代码运行是单线程。一次只执行一件事。这实际上是一个非常有用的限制,因为它简化了很多程序,从而不必担心并发问题。

您只需要注意编写代码的方式,避免任何可能阻塞线程的内容,如同步调用或无限循环。

通常,在大多数浏览器中,每个浏览器都有一个事件循环,以使每个进程隔离,并避免web页面具有无限循环或繁重的处理来阻塞整个浏览器。

你最需要担心的是,您的代码将在单个事件循环上运行,并在编写代码时考虑到这一点,以避免阻塞它。

阻止事件循环

任何花费太长时间将控制权返回给事件循环的JavaScript代码都会阻止页面中任何JavaScript代码的执行,甚至阻止UI线程,用户也无法点击,滚动页面等等。

几乎所有JavaScript中的I / O操作都是非阻塞的。网络请求,Node.js文件系统操作等。阻塞是个例外,这就是为什么JavaScript基于回调,以及最近的promises和async / await。

调用堆栈

调用堆栈是LIFO队列(Last In,FirstOut)。事件循环不断检查调用堆栈以查看是否存在需要运行的任何函数。

在执行此操作时,它会将它找到的任何函数调用添加到调用堆栈并按顺序执行每个调用。

一个简单的事件循环说明:

JAVASCRIPT与单个线程的工作

当此代码运行时,首先foo()调用。在foo()我们第一次调用bar(),然后我们调用baz()。

排队功能执行

上面的例子运行特点:JavaScript找到要执行的东西,按顺序运行它们。

让我们看看如何推迟函数直到堆栈清除:

用例setTimeout(()=> {}), 0)是调用一个函数,但是一旦执行了代码中的每个其他函数就执行它。

JAVASCRIPT与单个线程的工作

当此代码运行时,首先调用foo()。在foo()里面我们首先调用setTimeout,bar作为参数传递,然后我们指示它尽可能快地运行,将0作为计时器传递。然后我们调用baz()。

消息队列

调用setTimeout()时,浏览器或Node.js启动计时器。当计时器到期,我们将0作为超时,回调函数立即被放入消息队列中。

消息队列也是用户发起的事件(如单击事件、键盘事件或获取响应)在代码有机会对其作出响应之前排队的地方。或者像onLoad这样的DOM事件。

循环优先处理调用堆栈,它首先处理在调用堆栈中找到的所有东西,一旦调用堆栈中没有任何东西,它就会去获取事件队列中的东西。

我们不必等待像setTimeout,fetch或其他东西这样的函数来完成自己的工作,因为它们是由浏览器提供的,并且它们运行在自己的线程中。

ES6作业队列

ECMAScript 2015引入了Promises使用的作业队列概念(也在ES6 / ES2015中引入)。这是一种尽快执行异步函数结果的方法,而不是放在调用堆栈的末尾。

在当前函数结束之前解析的Prom将在当前函数之后立即执行。

我觉得在游乐园里过山车的比喻很好:消息队列将你放在队列的后面,在所有其他人的后面,你将不得不等待轮到你,而作业队列是快速通票这可以让你在完成上一个之后再骑一次。

JAVASCRIPT与单个线程的工作

这是Promises(和Async / await,它建立在promises上)和普通的旧异步函数setTimeout()或其他平台API 之间的巨大差异。

javascrit的事件循环是这门语言中非常重要且基础的概念。清楚的了解了事件循环的执行顺序和每一个阶段的特点,可以使我们对一段异步代码的执行顺序有一个清晰的认识,从而减少代码运行的不确定性。合理的使用各种延迟事件的方法,有助于代码更好的按照其优先级去执行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1289

    浏览量

    71630
  • javascript
    +关注

    关注

    0

    文章

    525

    浏览量

    54959
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 ?797次阅读
    深度剖析 RT-Thread <b class='flag-5'>线程</b>调度流程

    线程的安全注意事项

    线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作
    发表于 06-20 07:49

    RTOS如何在FX3中工作

    大家好, 我正在使用 FX3 进行一个项目。 我想知道 RTOS 调度是如何工作的。 我知道调用“CyU3PKernelEntry();”后 RTOS 就会开始工作。 如果我只注册一个应用程序线程。 我的
    发表于 05-06 13:20

    JavaScript与Rust和WebAssembly集成

    偶然一次机会,接触了Rust的代码。当时想给团队小伙伴做演示,发现自己并不能在移动端按照文档生成演示demo。我就想,要是Rust代码能转化成JavaScript就好了。结果一搜,还真有。
    的头像 发表于 01-24 15:43 ?478次阅读
    <b class='flag-5'>JavaScript</b>与Rust和WebAssembly集成

    SciChart—高性能的JavaScript图表和图形库

    使用 SciChart 的 JavaScript 图表库为您的 JS 应用程序发现终极解决方案。 使用 WebGL 创建动态、高速的图表和图形,非常适合实时处理复杂的数据可视化。使用我们强大而灵活
    的头像 发表于 01-22 10:15 ?786次阅读
    SciChart—高性能的<b class='flag-5'>JavaScript</b>图表和图形库

    Spire.XLS for JavaScript——多功能JavaScript电子表格库(一)

    Spire.XLS for JavaScript 是一款专为开发人员设计的 JavaScript Excel 工具库,支持在任何 JavaScript 环境下直接创建、读取、编辑和转换 Excel
    的头像 发表于 01-21 09:29 ?559次阅读
    Spire.XLS for <b class='flag-5'>JavaScript</b>——多功能<b class='flag-5'>JavaScript</b>电子表格库(一)

    Deno Land 请愿剥夺甲骨文 JavaScript 商标所有权

    去年11月,Deno Land 公司向美国商标和专利局(USPTO)提交了一份请愿书,要求剥夺甲骨文公司对 JavaScript 商标的所有权,并指控甲骨文存在欺诈行为。 Deno Land 公司
    的头像 发表于 01-15 15:37 ?421次阅读

    javascript:void(0) 是否影响SEO优化

    使用 javascript:void(0) 确实可能对SEO优化产生负面影响 。以下是关于 javascript:void(0) 对SEO影响的具体分析: 搜索引擎爬虫的理解问题 搜索引擎爬虫(如
    的头像 发表于 12-31 16:08 ?637次阅读

    javascript:void(0) 的作用是什么

    javascript:void(0) 在 HTML 和 JavaScript 中是一个常见的表达式,主要用来创建一个无操作的链接(通常是 标签)或者阻止默认事件处理。具体来说,它的作用有以下几点
    的头像 发表于 12-31 15:55 ?2934次阅读

    socket 多线程编程实现方法

    在现代网络编程中,多线程技术被广泛应用于提高服务器的并发处理能力。Socket编程是网络通信的基础,而将多线程技术应用于Socket编程,可以显著提升服务器的性能。 多线程编程的基本概念 多线
    的头像 发表于 11-12 14:16 ?1074次阅读

    摩尔线程完成股改,筹备上市

    近日,摩尔线程智能科技(北京)股份有限公司(简称“摩尔线程”)宣布已完成股改,并正积极筹备上市。据国家企业信用信息公示系统最新查询结果显示,摩尔线程的市场主体类型在10月28日已从其他有限责任公司
    的头像 发表于 11-12 14:15 ?1242次阅读

    摩尔线程与超图软件完成产品兼容认证

    。 据悉,为了确保产品间的兼容性,摩尔线程与超图软件进行了严格的测试工作。经过双方的努力,适配调优后的软件在摩尔线程GPU上展现出了卓越的性能表现。测试结果显示,软件在摩尔线程GPU上
    的头像 发表于 10-24 10:25 ?1058次阅读

    Python中多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。
    的头像 发表于 10-23 11:48 ?1076次阅读
    Python中多<b class='flag-5'>线程</b>和多进程的区别

    CPU线程和程序线程的区别

    CPU的线程与程序的线程在概念、作用、实现方式以及性能影响等方面存在显著差异。以下是对两者区别的详细阐述,旨在深入探讨这一技术话题。
    的头像 发表于 09-02 11:18 ?2209次阅读

    一文掌握Python多线程

    使用线程可以把占据长时间的程序中的任务放到后台去处理。
    的头像 发表于 08-05 15:46 ?1340次阅读