JavaScript工作机制(一)

JavaScript工作机制(一)

本文转载:原文链接:http://www.zcfy.cc/article/3965

概述

几乎所有人都已经听说过V8引擎的概念,大多数人都知道JavaScript是单线程的,或者是使用回调队列。
在这篇文章中,我们将详细介绍这些概念,并解释JavaScript的工作机制。通过了解这些细节,您将能正确利用提供的API,编写更好的非阻塞应用程序。

JavaScript引擎

JavaScript引擎的一个流行示例是Google的V8引擎。例如,V8引擎在Chrome和Node.js中使用。如下所示:

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

  • 内存堆:这是内存分配发生的地方
  • 调用栈:代码执行所在的栈帧

运行时

浏览器中已经有几个巨虎JavaScript开发人员都会使用的API(比如:setTimeout)。不过,这些API不是由引擎提供的。
事实证明,现实有点复杂:

所以,除了引擎以外,实际上还有更多东西。有一些由浏览器提供的,称为Web API的东西,比如DOM,Ajax,setTimeout等等。还有事件循环回调队列

调用栈

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

调用栈是一种数据结构,它基本上记录了我们处于程序中哪个地方。如果单步执行一个函数,就把该函数放到栈顶如果从函数返回,就把它从栈顶弹出。这就是栈所做的事情。

并发和事件循环

当在调用栈中有函数调用需要大量时间才能处理完时,会发生什么?例如,假如想在浏览器中使用JavaScript进行一些复杂的图像转换。

你可能会问-这怎么就成了一个问题呢?原因是,在调用堆有函数要执行的同时,浏览器实际上不能做任何事情–他被阻塞了。这意味着浏览器无法渲染,他不能运行任何其它代码,它只是卡住了。如果想在应用中有流畅的UI,则会出现问题。

而这不是唯一的问题。一旦浏览器开始处理调用栈中的许多任务,他可能会停止响应很长时间。

那么,如何执行繁重的代码,而不阻塞UI并且不会使浏览器无响应呢?解决的方案是异步回调