js是如何工作的级v8引擎(全摘抄)

v8引擎主要由两部分组成:

emory heap(內存堆) — 内存分配地址的地方

Call stack(调用堆栈) — 代码执行的地方

Runtime(运行时)

有些浏览器的API经常被使用到(例如:setTimeout),而这些API是浏览器提供的 ,我们称之为Web API,比如DOM、AJAX、setTimeout等

调用栈

JavaScript是一种单线程编程语言,这意味着它只有一个调用堆栈。因此,它一次只能做一件事。

调用栈是一种数据结构,它记录了我们在程序中的位置。如果我们运行一个函数,它就会将其放置到栈顶,当从这个函数返回的时候,她就会将这个函数从栈顶弹出,这就是调用栈做的事情。

举例:

js是如何工作的级v8引擎(全摘抄)

当程序开始运行的时候,调用栈是空的,然后,步骤如下:

js是如何工作的级v8引擎(全摘抄)

每一个进入调用栈的都称为调用栈。

这能清楚的知道当异常发生的时候堆栈追踪是怎么被构造的,堆栈的状态是如何的,让我们看看下面的代码:

js是如何工作的级v8引擎(全摘抄)

如果这发生在Chrome里(假设这段代码是在一个foo.js的文件中),那么将会生成以下的堆栈追踪:

js是如何工作的级v8引擎(全摘抄)

“堆栈溢出”,当你达到调用栈最大的大小的时候就会发生这种情况,而且这相当容易发生,特别是在你写递归的时候却没有在全方位的测试它。我们来看看下面的代码:

js是如何工作的级v8引擎(全摘抄)

当引擎开始执行这段代码时,它首先调用函数“foo”.然而,这个函数是递归的,并且在没有任何终止条换下开始调用自己。因此,在执行的每一步中,相同的函数都会被执行一次又一次的添加到调用堆栈中,如下所示:

 

js是如何工作的级v8引擎(全摘抄)

然后,在某些时候,调用堆栈中的函数调用数量超过了调用堆栈的实际大小浏览器决定采取行动,抛出一个错误,它可能是这样的:

js是如何工作的级v8引擎(全摘抄)

并发与事件循环

当调用栈有函数要执行时,;浏览实际上不能做任何其他的事情——它被阻塞了,这就意味着浏览器不呢呈现,她不能运行其他,它只是卡住了,如果你想在应用中使用流程的页面效果,这就会产生问题。

而且这不熟唯一的问题,一旦你的浏览器开始处理调用栈中的众多任务,它可能会响应相当长一段时间。大多数浏览器都会这么做,报一个错误,问你是否需要终止web页面。

为了不阻塞UI和不使浏览器失去响应的情况下执行大量代码,我们就需要使用异步回调来解决这个问题了

(完)