软件研发

JavaScript是单线程语言吗?

2020-07-21 14:43:12 | 来源:中培企业IT培训网

如果使用Java脚本已有一段时间,则可能会碰到它是一种单线程语言的短语。那么JavaScript是单线程语言吗?Javascript引擎在具有内存堆和调用堆栈的V8引擎上运行。JS是一个单线程,这意味着一次只执行一个语句。在我们深入研究它在单线程上运行的含义之前。我想先介绍一下可以帮助您理解的术语。本文将以最简单的方式进行解释。为了更好地理解这一点,需要了解一种称为堆栈的数据结构。

同步执行通常是指按顺序执行的代码。在同步编程中,程序一行一行地执行,一次一行。每次调用一个函数时,程序执行都会等到该函数返回后再继续执行下一行代码。举例来说,您正在呼叫某人,并且正在等待他们接听,以便您可以与他们交谈。在他们拿起电话之前,您没有做任何其他事情,可以顺序执行请求。

const one() => {

const two() => {

console.log('5');

}

two();

}

那么,在调用堆栈下会发生什么呢?

调用堆栈的工作是填写指令并在执行指令时弹出指令。

Javascript是一种单线程语言,可以是非阻塞的。单线程意味着它只有一个调用堆栈。调用堆栈顶部的所有内容都将首先运行。

在以上程序中,功能按顺序运行。

如果我们有一项繁重的工作需要怎么办?我们应该让用户等到该过程结束吗?

const one() {

console.log("Hello");

}const two () {

for(i=0; i<= 100000000000000000000000; i++){

}const three(){

console.log("World");

}

one();

two();

three();

考虑上面的示例,如果我们的第二个函数必须循环遍历大量数字该怎么办。这是否意味着three()必须等到执行two()。

在我们的小示例中,这可能并不意味着什么,但是如果我们必须在一个真实的项目中实施,那么在第一个过程完成之前,用户可能无法执行任何操作。

异步执行是指未按照代码中出现的顺序运行。在异步编程中,程序不会等待任务完成,而是可以继续执行下一个任务。

举个例子:您打电话给某人,而在等待他们接听电话的同时,您也在跑腿。

不同的语言有不同的方式来实现异步。最受欢迎的是通过多线程。简而言之,Java通过创建一个子线程来实现多线程,该子线程执行自己的单独执行,然后与父线程合并回去。但是,这可能会遇到称为死锁的问题,可以使用各种防止死锁的机制来解决。

从那以后,我们关注用Java脚本实现异步。让我们看看我们如何做到这一点。尝试在控制台中运行它,看看会发生什么。

console.log('1');

setTimeout(()=> {console.log('2')}, 3000);console.log('3');

  您可能会看到1或者3并短暂出现2。为什么会这样呢?

简而言之,JavaScript的异步实现是通过调用堆栈,回调队列以及Web API和事件循环来完成的。

如我们前面所见,调用堆栈作业是检查堆栈顶部的指令并执行它。

事件循环的作用是连续检查是否发生了事件,例如单击鼠标或键盘击键,以便将其发送到调用堆栈。当然,您希望鼠标单击的执行优先于图像加载。

在Javascript中,所有指令都放在调用堆栈中。当执行指针到达setTimeout时,引擎将其视为Web API指令并将其弹出并发送给Web API,并且调用堆栈将继续执行其余指令。完成Web API的执行后,它将到达回调队列。

引擎检查调用堆栈是否为空。如果为空,则在我们的情况下检查回调队列,其中有setTimeout的响应。回调队列将其发送到回调堆栈,并执行指令。

考虑此问题的另一种方法是在发出API请求时。假设您的网站需要从服务器获取图像。您的网站是否应该在图像到达之前拒绝加载其他部分?那将是糟糕的用户体验。

当调用堆栈看到它需要获取图像时,它将弹出并发送到WebAPI,然后继续执行其余功能。图像请求的响应存储在调用堆栈队列中。

当调用堆栈为空时,连续运行的事件循环将查看调用堆栈队列(如果有)。如果是这样,则在我们的情况下是图像请求的响应。它将其放在调用堆栈上并执行指令。

此过程的好处是JavaScript无需担心CPU正在运行多少个内核或节点。此实现只有一个调用堆栈。以上就是关于JavaScript是单线程语言吗的全部内容,想了解更多关于JavaScript的信息,请继续关注我们吧。