那么,什么?我用语言来完成事情。对于我和Javascript,这个过程从构建一个小游戏、ajax请求和表单验证开始。我们与Hapijs的联系越来越深。自从我遇到React以来,我一直在研究它。现在,要成为更好的程序员,你必须问为什么事情会这样运作。Javascript运行时对我来说是最大的谜团之一。什么是Javascript引擎和运行时?Javascript运行时是指JavaScript代码在运行时执行的位置。也就是说,javascript可以在googlechrome上执行,在这种情况下,您的javascript引擎是v8,如果在mozilla上-它是spidermonkey,如果它是IE-那么它的脉轮,如果在safari上-它是nitro,如果在node上,它是v8。现在什么是JS引擎,什么是JS运行时?引擎将我们编写的JavaScript转换为机器代码。所有JavaScript引擎都实现了ECMAScript提供的语言规范。标准化促进了独立引擎的开发,并确保您的脚本无论在何处运行都获得相同的结果。为了提高速度,V8将JavaScript代码转换为更高效的机器代码,而不是使用解释器。它通过像许多现代JavaScript引擎(例如SpiderMonkey或Rhino(Mozilla))一样实施JIT(即时)编译器,在执行时将JavaScript代码编译为机器代码。这里的主要区别在于V8不生成字节码或任何中间代码。JavaScript引擎只是一个更大概念的一部分。该引擎在称为JavascriptRuntime的环境中工作,它为我们的脚本提供了额外的功能。这些功能可能包括拨打网络电话、捕捉鼠标/键盘事件等,这就是JSRuntime的架构。V8没有这些WebAPI。这些由运行时给出。在chrome浏览器JS运行时,浏览器有它,而在Node中,它由C++库提供。>运行时架构让我们看看Javascript是如何异步和单线程的。单线程,什么?Javascript代码在单线程中执行,但Javascript运行时不在单线程中运行。线程池存在于JS运行时,但我们不必担心,因为运行时会处理它。但那是怎么做到的呢?可以挽救事件循环。让我们了解什么是运行时(或属于运行时的JS引擎)中的堆和调用堆栈。javascript代码首先转换为机器代码。堆存储所有变量,调用堆栈执行操作。console.log("Start")函数sayHello(name){console.log(`Hello${name}!`)}sayHello("Abhinav");console.log("End")所有这些都进入调用堆栈并在那里执行。StartHelloAbhinavEnd我们可以将脚本分为两种类型,立即调用和稍后调用。当异步任务到达时会发生什么?该任务需要时间才能运行。就像进行API调用或计时器等。有一个称为回调的概念。这是完成此任务后要执行的函数。好吧,它们作为任何普通函数进入调用堆栈,但由于此任务驻留在WebAPI中,因此我们调用WebAPI。它存储任务的回调函数并为我们完成(根据运行时使用线程/多处理)。当任务完成时,它会向回调队列发送一个回调。在这里再次可视化。现在什么是事件循环?事件循环不断运行(在浏览器运行时,并不总是在node中运行)检查调用栈是否为空,如果是,则从回调队列中拉取第一个调用栈中的一个项移动到调用堆栈并执行回调函数。在堆栈不为空之前,不会从回调队列中添加任何函数。回调总是完全执行。事件循环一次运行一个回调。没有上下文切换。队列中的所有回调必须等到当前回调完成。如果一个脚本运行时间过长,其他脚本将被阻止。这就是回调应该相对简短的原因。很简单!但实际上,情况要复杂得多。有多个队列,取决于运行时,它们有不同的优先级。有类似渲染队列的东西。谁的工作是渲染屏幕。非阻塞状态怎么样?假设您在调用API时失败,或者发生了其他事情,该事件仍然存在于WebAPI中,因此它永远不会进入回调队列,因此不会进入调用堆栈。因此,没有任何东西被阻止。是并发的吗?parallel和parallel和有什么不一样?并行是您同时执行2个任务的地方。(边吃爆米花边看电影)。这是通过多核实现的。JS代码是并行执行的,不是并发的,在调用栈中。但是WebAPI可以利用多核并并行运行。原文链接:https://theflyingmantis.medium.com/javascript-single-threaded-non-blocking-asynchronous-concurrent-language-ffae97c57bef)
