首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript引擎如何工作的?从调用栈到Promise你需要知道的一切

JavaScript Engines: How Do They Even Work? 你有没有想过浏览器是如何读取和运行 JavaScript 代码的吗?...当一个函数被调用时,JavaScript 引擎会为另外两个盒子腾出空间: 全局执行上下文环境 调用栈 全局执行上下文和调用栈 在上一节你了解了 JavaScript 引擎如何读取变量和函数声明的,他们最终进入了全局内存...但是当进行网络通信和与外界的互动时呢? 幸运的是 JavaScript引擎被默认设计为异步。即使他们一次可以执行一个函数,也有一种方法可以让外部实体执行较慢的函数:在我们的例子中是浏览器。...; 4} 你肯定多次见到过 setTimeout ,但是你可能不知道它不是一个内置的 JavaScript 函数。即当 JavaScript 诞生时,语言中并没有内置的 setTimeout。...在完成后执行该函数。 这是用于处理异步和同步代码的 JavaScript 引擎的大图: JavaScript引擎大图 想象一下,callback() 已准备好执行。

1.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

js异步机制

:处理DOM事件 异步http请求线程:处理http请求 需要注意的是,渲染线程和JS引擎线程是不能同时进行的。...渲染引擎就是如何渲染页面的,Chrome、Safari、Opera用的是Webkit引擎,IE用的是Trident引擎,FireFox用的是Gecko引擎。...之所以说JavaScript是单线程,就是因为浏览器在运行时只开启了一个JS引擎线程来解析和执行JS。那为什么只有一个引擎呢?如果同时有两个线程去操作DOM,浏览器是不是又要不知所措了。...所以,虽然JavaScript是单线程的,可是浏览器内部不是单线程的。一些I/O操作、定时器的计时和事件监听(click,keydown)等都是由浏览器提供的其他线程来完成的。...三、消息队列和事件循环 通过以上了解,可以知道其实JavaScript也是通过JS引擎线程和浏览器中其他线程交互协作实现异步。但是回调函数具体何时加入到JS引擎线程中执行?执行顺序是怎么样的?

2.5K40

静态网站生成器与服务器端渲染有啥区别

这意味着数据获取和页面内容的生成是提前完成的,存储为静态文件,并在用户请求时提供。...改进的SEO:服务器端渲染使页面易于被搜索引擎索引,而不像客户端渲染那样,爬虫必须先执行一些JavaScript代码才能访问页面的HTML内容。...这意味着数据获取和页面内容的生成在服务器上提前完成,并在用户请求时提供给用户。...何时使用静态网站生成和服务器端渲染? 对于主要包含静态信息且需要高流量的网站,使用静态网站生成是合适的选择。而对于内容经常变动且需要强大的搜索引擎优化的网站,应该使用服务器端渲染。...现在,你拥有了创建快速加载页面、对搜索引擎友好并为所有用户提供出色用户体验的知识和技能,无论他们的网络连接速度如何。通过应用从本文中获得的知识,你可以为你的项目做出明智的渲染方法决策。

21510

现代浏览器内部机制 Part 2 | 导航这件小事

在 Step 2 中,当 UI 线程将需要请求的 url 告诉网络线程时,其实它本身已经知道要导航到哪个网站了,于是 UI 线程在把 url 传递给网络线程的同时,会尝试启动一个渲染进程。...Service Worker 是一种可以在应用代码中编写网络代理的方法;增强了开发者对于本地缓存以及何时发起网络请求的控制。...那么问题来了:当用户发起一次导航时,浏览器进程是如何知道目标站点存在一个 Service Worker 的呢? ?...了解了浏览器是如何一步步从网络请求数据的,这能让我们更好的理解很多 API 比如导航预加载的诞生初衷。...在下一篇文章中,我们会深入讨论浏览器是如何执行 HTML/CSS/JavaScript 代码从而完成一个页面的渲染的。

1.1K30

现代浏览器探秘(part2):导航

因为在Chrome中,地址栏也是搜索输入框,因此UI线程需要解析并判断是将你的输入发送到搜索引擎还是去请求对应的网站。 ?...图5:网络线程告诉UI线程找到渲染进程 由于网络请求可能需要几百毫秒才能得到响应,所以在这里进行了加速此过程的优化。 当UI线程在第2步向网络线程发送URL请求时,它已经知道他们正在导航到哪个站点。...service worker是一种在应用代码中编写网络代理的方法;它允许Web开发人员更好地控制本地缓存内容以及何时网络获取新数据。...但是当导航请求到来时,浏览器进程怎么才能知道该站点有Service Worker?...图12:浏览器进程中的UI线程启动渲染器进程,在并行启动网络请求的同时处理Service Worker 总结 在本文中,我们研究了导航过程中发生的事情,以及响应头和客户端JavaScript等Web应用代码是如何与浏览器交互的

2K20

构建现代Web应用时究竟是选择传统web应用还是SPA

今天这篇文章我们就来一起探讨下,构建现代web应用时该如何进行选择。...里面如是说: 何时应使用传统 Web 应用程序: 应用程序的客户端要求简单,甚至要求只读。 应用程序需在不支持 JavaScript 的浏览器中工作。...团队不熟悉 JavaScript 或 TypeScript 开发技术。 何时应使用 SPA: 应用程序必须公开具有许多功能的丰富的用户界面。...例如,搜索引擎可能由一个带有文本框的入口点和用于显示搜索结果的第二页组成。 匿名用户可以轻松提出请求,并且很少需要使用客户端逻辑。...SPA 支持增量更新,可保存尚未完成的窗体或文档,而无需用户单击按钮提交窗体。 SPA 支持丰富的客户端行为,例如拖放,比传统应用程序更容易操作。

1.4K30

【云+社区年度征文】面试官问我Chrome浏览器的渲染原理(6000字长文)

前言 对于HTML,css和JavaScript如何变成页面的,这个问题你了解过吗?浏览器究竟在背后都做了些什么事情呢?...HTML,css,JavaScript数据经过中间渲染模块的处理,最终显示在页面上(其中HTML超文本标记语言,CSS层叠样式表,JS为JavaScript,大家一般都知道是什么,写过网页的朋友,学习者大都知道的...浏览器引擎:在用户界面和呈现引擎之间传送指令。 呈现引擎:负责显示请求的内容。 网络:用于网络调用,比如HTTP请求;其接口与平台无关,并为所有平台提供底层实现。...主流程 呈现引擎一开始会从网络层获取请求文档的内容,其大小一般限制在8000个块以内。 呈现引擎将开始解析HTML文档,并将各标记逐个转化成“内容树”上的DOM节点。...因为JavaScript可能会修改dom,导致后面的HTML资源白白加载,需要等待JavaScript文件加载完成后,再继续渲染,so,JavaScript文件一般写在底部body标签前的原因。

1.4K211

node.js进阶学习

为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案。...即使是要实现 web 服务器在安装完成后启动并运行这个基本功能,也还需要做大量工作。 Node 如何工作 Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?...V8 JavaScript 引擎是 Google 用于他们的 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?...实际上,JavaScript 引擎负责解释并执行代码。使用 V8,Google 创建了一个以 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。...它使用 Google 的一个非常快速的 JavaScript 引擎:V8 引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。

1.1K70

前端面试题库系列(2)

[a-zA-Z0-9]{2,6}$/;//邮箱验证 // 9、简述ajax的原理,并说明如何实现跨域?...假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。...5xx系列:代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成请求的处理。常见有500、503状态码。   ...500状态码:服务器遇到了一个未曾预料的状况,导致了它无法完成请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。   503状态码:由于临时的服务器维护或者过载,服务器当前无法处理请求。...通过查看网站日志的HTTP码,我们可以清楚查看搜索引擎在网站的爬取情况。

64420

网站开发人员应该知道的61件事

同时,不同的操作系统,可能也会影响浏览器如何呈现你的网站。 1.2 除了浏览器,网站还有其他使用方式:手机、屏幕朗读器、搜索引擎等等。你应该知道在这些情况下,你的网站的运行状况。...1.7 知道如何实现网页的渐进式增强(progressive enhancement)。 1.8 用户发出POST请求后,总是将其重导向(redirect)至另外一个网页。...这里的一个好方法就是使用"内容分发网络"(Content Delivery Network,CDN)。 3.9 将浏览器完成网页渲染所需要的http请求数最小化。...4.7 知道robots.txt的作用,以及搜索引擎蜘蛛的工作原理。...5.3 理解浏览器如何处理JavaScript脚本。 5.4 理解网页上的JavaScript文件、样式表文件和其他资源是如何装载及运行的,考虑它们对页面性能有何影响。

65540

一个页面从输入URL到加载显示完成,发生了什么?

计算机网络 五层因特尔协议栈: 应用层(dns、http):DNS解析成IP并完成http请求发送; 传输层(tcp、udp):三次握手四次挥手模式建立tcp连接; 网络层(IP、ARP):IP寻址...如果递归服务器没有答案,他们会查询根域名服务器; 根域名服务器是一种计算机,它扮演着一种DNS的电话接线员的角色,他们不知道答案,但可以将我们的疑问指向知道在哪里可以找到答案的人。...2.JS引擎线程: JS内核,负责处理JavaScript脚本程序(V8引擎) 负责解析JavaScript脚本,运行代码; JS引擎一直等待着任务队列中的任务到来,然后加以处理,一个tab页面(renderer...简洁版: 浏览器根据请求的URL交给DNS域名解析,找到真实的IP,向服务器发起请求; 服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、CSS、JavaScript等); 浏览器对加载到的资源...代码,就会调用JavaScript引擎JavaScript代码进行解释执行,此时由JavaScript引擎和GUI渲染线程的互斥,GUI渲染线程就会被挂起,渲染过程停止;如果JavaScript代码的运行中对

1.6K20

聊一聊前端性能优化 CRP

样式计算完成之后,渲染引擎还需要计算布局树中每个元素对应的几何位置,这个过程就是计算布局。...加载阶段,是指从发出请求到渲染出完整页面的过程,影响到这个阶段的主要因素有网络JavaScript 脚本。...通过上面对浏览器渲染过程的分析我们知道JavaScript、首次请求的 HTML 资源文件、CSS 文件是会阻塞首次渲染的,因为在构建 DOM 的过程中需要 HTML 和 JavaScript 文件,在构造渲染树的过程中需要用到...请求关键资源需要多少个RTT(Round Trip Time)。RTT 是网络中一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认,总共经历的时延。...一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。下图是浏览器缓存的查找流程图: ?

86630

面试官问我Chrome浏览器的渲染原理(6000字长文)

前言 对于HTML,css和JavaScript如何变成页面的,这个问题你了解过吗?浏览器究竟在背后都做了些什么事情呢?...HTML,css,JavaScript数据经过中间渲染模块的处理,最终显示在页面上(其中HTML超文本标记语言,CSS层叠样式表,JS为JavaScript,大家一般都知道是什么,写过网页的朋友,学习者大都知道的...image 让你说说浏览器的主要功能: 就是向服务器发出请求,在浏览器窗口中展示您选择的网络资源,资源一般指HTML文档,可以是PDF,图片或其他的类型。...浏览器引擎:在用户界面和呈现引擎之间传送指令。 呈现引擎:负责显示请求的内容。 网络:用于网络调用,比如HTTP请求;其接口与平台无关,并为所有平台提供底层实现。...主流程 呈现引擎一开始会从网络层获取请求文档的内容,其大小一般限制在8000个块以内。 呈现引擎将开始解析HTML文档,并将各标记逐个转化成“内容树”上的DOM节点。

1.8K30

浏览器工作原理分析与首屏加载

大抵的过程可以简化为: st=>start: 输入URL e=>end: 呈现页面 op1=>operation: 发起请求:URL解析/DNS解析 op2=>operation: 网络连接:三次握手...2.1 了解浏览器组成 浏览器主要由7个部分组成:用户界面(User Interface)、浏览器引擎(Browser engine)、渲染引擎(Rendering engine)、网络(Networking...渲染引擎:处理HTML、CSS的解析与渲染 JavaScript解释器:解析和执行JavaScript代码 UI后端:指浏览器的的图形库等 网络:用于网络调用,比如HTTP请求 问题:Webkit...Webkit的祖师爷是Safari,是浏览器引擎,而V8的是老爸是Google,是JavaScript解释器引擎。...页面瘦身:压缩HTML、CSS、JavaScript。 减少请求:CSS、JavaScript文件数尽量少,甚至当CSS、JS的代码不多时,可以考虑直接将代码内嵌到页面中。

1.7K100

JavaScript内部原理:浏览器的内幕

JavaScript引擎 最流行的JavaScript引擎是V8,它是用c++编写的,并被基于Chrome的浏览器使用,如Chrome、Opera甚至Edge。...此外,我们还需要在发出网络请求时处理用户交互,对此却无能为力。当所有代码都是同步的时候,我们如何实现并发呢? 这还得感谢浏览器引擎。 浏览器引擎负责用 HTML 和 CSS 渲染页面。...直到 V8 完成它的工作,才会处理来自网络请求的响应。 想象一下,我们如果在浏览器中运行的程序中解析图像。...一旦操作完成,回调就被放入事件队列。同时,V8可以继续执行 JS 代码。 使用这种并发模型,我们可以处理网络请求、用户与UI的交互等等,而不会阻塞 JS 执行线程。...现在我们知道了异步JavaScript如何工作的,调用堆栈、事件循环、事件队列和作业队列在其并发模型中的角色。 你可能已经猜到的,在V8引擎和浏览器引擎后面还有很多工作要做。

1.1K30

息息相关的 JS 同步,异步和事件轮询

虽然单线程简化了编程代码,因为这样咱们不必太担心并发引出的问题,这也意味着在阻塞主线程的情况下执行长时间的操作,如网络请求。...使用异步 (如 回调函数、promise、async/await),可以不用阻塞主线程的情况下长时间执行网络请求。 了解异步的工作方式之前,咱们先来看看同步是怎么样工作的。...同步 JS 是如何工作的? 在深入研究异步JS之前,先来了解同步 JS 代码在 JavaScript 引擎中执行情况。...假设咱们正在以同步的方式进行图像处理或网络请求。...事件轮询、web api和消息队列不是JavaScript引擎的一部分,而是浏览器的JavaScript运行时环境或Nodejs JavaScript运行时环境的一部分(对于Nodejs)。

9.7K31

JavaScript执行机制

相关概念浏览器我们都知道,是典型的多进程模型,但是JavaScript的运行时却是单线程的架构,我们来从浏览器出发看看具体JavaScript的运行时在浏览器中处于什么位置。...简单说就是当执行到一个http异步请求时,就把异步请求事件添加到异步请求线程,等收到响应(准确来说应该是http状态变化),再把回调函数添加到事件队列,等待js引擎线程来执行宏任务与微任务了解JavaScript...注意:轮询 阶段(poll) 控制何时定时器执行。...它使用一个 libuv API 来安排回调在 轮询 阶段完成后执行。通常,在执行代码时,事件循环最终会命中轮询阶段,在那等待传入连接、请求等。...相反,它都将在当前操作完成后处理 nextTickQueue, 而不管事件循环的当前阶段如何

30822

HTML加载顺序

完成了若干个基于WEB的项目, 也了解了从前端的js,css,html到后端python/php等, 二者如何交互, 最终浏览器如何执行, 这些在心里也已经很明确了....不过一个问题一直萦绕在心中,那就是: 一个html有若干个外部资源(js,css,flash,image等),这些请求何时下载的,又是何时执行的?...不清楚,不明白, 所以也就不知道我写的js究竟何时执行的, 也就不知道为什么很多高性能的建议是要将js置于一个 html底端的之前. 如果你也不是很明确,请来和我一起学习吧....请求分析 首先说明下面这些描述主要是基于自己google, 咨询朋友和在 SO 和 IRC 上获得, 我并没有阅读相关的spec(当然我很想阅读,如果知道相关spec的朋友请留言谢谢), 不能保证其正确性和准确性...知道what, 说明你开始去关注背后是如何实现的, 随着时间推进, 这时候你会逐渐成为一个有经验的程序员.

1.8K30

从 8 道面试题看浏览器渲染过程与性能优化

JS 引擎线程 Javascript 引擎,也称为 JS 内核,负责处理 Javascript 脚本程序。...,如鼠标点击、AJAX 异步请求等),会将对应任务添加到事件线程中 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待 JS 引擎的处理 注意,由于 JS 的单线程关系...异步 http 请求线程 在 XMLHttpRequest 在连接后是通过浏览器新开一个线程请求。...因此,我们可以得出结论: defer 和 async 在网络读取(下载)这块儿是一样的,都是异步的(相较于 HTML 解析) 它俩的差别在于脚本下载完之后何时执行,显然 defer 是最接近我们对于应用脚本加载和执行的要求的...RenderObjects 保持了树结构,一个 RenderObjects 知道如何绘制一个 node 的内容, 他通过向一个绘图上下文(GraphicsContext)发出必要的绘制调用来绘制 nodes

1.1K40
领券