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

    文章

    1230

    浏览量

    68381
  • javascript
    +关注

    关注

    0

    文章

    507

    浏览量

    53379
收藏 人收藏

    评论

    相关推荐

    javascript属于前端吗

    JavaScript是一种高级编程语言,通常用于网页开发。它是一种脚本语言,可用于在网页上动态交互,提供更好的用户体验。JavaScript是一种广泛使用的技术,几乎所有现代网页都使用它来实现交互性
    的头像 发表于 12-03 11:43 575次阅读

    怎样开启javascript功能

    JavaScript是一种客户端脚本语言,它可以在网页中实现动态交互和功能增强。在现代网页开发中,几乎所有的浏览器都支持JavaScript,因此,开启JavaScript功能是很简单的。 要开启
    的头像 发表于 12-03 11:13 678次阅读

    JavaScript的用途和功能

    JavaScript是一种广泛使用的脚本语言,用于为网站添加动态功能和交互性。从创建简单的交互式表单到设计复杂的网页游戏,JavaScript为开发者提供了丰富的功能和灵活的创作能力。它在现代的网页
    的头像 发表于 12-03 11:12 389次阅读

    javascript指什么

    JavaScript是一种高级编程语言,通常用于为网页添加交互功能。它是一种面向对象的语言,旨在通过编写代码来控制网页的行为,使用户能够与网页进行动态交互。JavaScript能够与HTML和CSS
    的头像 发表于 12-03 11:11 352次阅读

    javascript运行环境有哪些

    JavaScript 是一种广泛应用于网页开发的编程语言,它可以在不同的运行环境下运行。以下是一些常见的 JavaScript 运行环境: 浏览器环境: 浏览器是最常见的 JavaScript 运行
    的头像 发表于 11-27 16:11 932次阅读

    javascript:;怎么解决

    javascript:” 是一个JavaScript伪协议,它通常出现在URL地址栏或链接中,用于执行JavaScript代码。然而,有时它可能会导致一些问题,特别是在一些不支持
    的头像 发表于 11-26 14:39 1738次阅读

    浏览器怎么打开javascript

    浏览器是一种用于浏览和访问互联网页面的应用程序,而JavaScript是一种常用的网页编程语言,用于给网页添加交互和动态效果。本文将详细探讨如何在浏览器中打开JavaScript,并解释
    的头像 发表于 11-26 11:25 845次阅读

    javascript深入浅出

    JavaScript是一种广泛使用的编程语言,常用于Web开发。下面是对JavaScript的深入浅出的解释: JavaScript简介 JavaScript是一种解释型、动态类型、基
    的头像 发表于 11-16 10:34 314次阅读

    javascript可以关闭吗

    **JavaScript是一种编程语言,它不能被“关闭”。**JavaScript是一种客户端脚本语言,它通常嵌入在HTML页面中。当用户访问一个包含JavaScript的网页时,浏览器会执行这些
    的头像 发表于 11-16 10:20 460次阅读

    javascript有什么用

    JavaScript是一种广泛使用的编程语言,主要用于增强网页和创建动态网页内容。以下是JavaScript的一些主要用途: 交互性:JavaScript可以使网页具有交互性。例如,当用户点击按钮
    的头像 发表于 11-16 10:19 331次阅读

    javascript怎么开启

    在浏览器中启用 JavaScript 的方法如下: 在浏览器中启用 JavaScript 对于大多数浏览器,您可以在浏览器的设置或选项中启用 JavaScript。以下是一些常见浏览器的启用步骤
    的头像 发表于 11-16 10:16 674次阅读

    一个有许多线程的进程,如何才能改变其中一个线程工作目录?

    一个有许多线程的进程,我们如何才能改变其中一个线程工作目录,而不影响其他?
    发表于 10-17 09:01

    线程是什么意思?

    线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算。 超线程(HT, Hyper-Threading)是英特尔研发的一种技术,于20
    的头像 发表于 09-01 19:28 9886次阅读

    华为麒麟9000S处理器为8核12线程 首款支持超线程手机处理器

    逻辑内核模拟成两个物理芯片,让单个处理器就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程技术可以充分利用空闲CPU资源,在相同时间内完成更多
    的头像 发表于 09-01 16:32 9171次阅读

    简述javascript定时器工作原理

    说到 javascript 中的定时器,我们肯定会想到 setTimeout() 和 setInterval() 这两个函数。本文将从事件循环(Event Loop) 的角度来分析两者的工作原理和区别。
    的头像 发表于 04-21 14:32 559次阅读
    简述<b class='flag-5'>javascript</b>定时器<b class='flag-5'>工作</b>原理