热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript事情道理之一-引擎,運行時,挪用客棧(譯)

原文請查閱這裏,本文採納學問同享簽名4.0國際允許協定同享,BYTroland。本系列延續更新中,Github地點請查閱這裏。這是JavaScript事變道理的第一章。本章會對言語

原文請查閱
這裏,本文採納
學問同享簽名 4.0 國際允許協定同享,BY
Troland。

本系列延續更新中,Github 地點請查閱這裏。

這是 Javascript 事變道理的第一章。本章會對言語引擎,運轉時,挪用棧做一個概述。

跟着 Javascript 愈來愈盛行,團隊也應用其在他們諸如前端,後端,夾雜 apps,嵌入裝備以及更多裝備等開闢棧中的差別層面的支撐。

本章系列的第一章,本系列旨在深切 Javascript 並明白它是怎樣運轉的:我們以為在相識 Javascript 的構建模塊和它們是怎樣捏合在一起事變以後你將會寫出更好的代碼和 apps。我們將會分享一些當在建立 SessionStack 時候的履歷軌則,SessionStack 是一個輕量級的 Javascript 順序它具有強健性和高性能的長處以堅持競爭力。

正如 GitHut stats 所顯現的那樣,Javascript 的活潑庫和總推送數在 Github 排名第一。別的方面的表現也不會比別的言語落下太多。

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

(點擊檢察最新 Github 言語統計)

假如工程非常依賴於 Javascript,那末這意味着開闢者不能不運用 Javascript 和其言語生態供應的統統事物,為了可以創造出很酷的軟件,就得越發深切地相識 Javascript 言語的內部事變機制。

事實上,有許多開闢者在天天一樣平常開闢中都會運用 Javascript 然則卻不相識其底層的學問。

概述

險些所有人都已聽說過 V8 引擎的觀點,而且許多人曉得 Javascript 是單線程的也許說是運用回調行列的。

在本章中,我將會細緻地過一下這些觀點並詮釋 Javascript 的事變道理。有賴於相識這些細節,經由歷程合理地運用供應的 APIs 你將可能寫出更好的,非壅塞的順序。

假如你是新手,本文將會協助你明白為何和別的言語比較 Javascript 是難以設想的。

假如你是一個履歷豐富的 Javascript 開闢者,希望,它將會讓你越發深切地相識 Javascript 運轉時事變道理。

Javascript 引擎

谷歌 V8 引擎是盛行的 Javascript 引擎之一。V8 引擎在諸如 Chrome 和 Node.js 內部運用。這裡有一個簡樸的視圖來描寫其也許。

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

引擎包含兩個重要組件:

  • 動態內存治理 - 在這裏分派內存
  • 挪用棧-這裏代碼實行等於你的客棧組織

運轉時

險些每一個 Javascript 開闢者都運用過一些閱讀器 API(比方 setTimeout)。但是這些 API並非引擎所供應的。

那末它們從何而來?

事實上這個狀況有點龐雜呃。。

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

所以,除了引擎然則現實上另有更多別的方面的東西。有被稱為 Web API 的東西,這些 Web API 是由閱讀器供應的,比方 DOM,AJAX,setTimeout 以及別的。

於是乎,就有了盛行的事宜輪迴和回調行列。

挪用棧

Javascript 只是一個單線程的編程言語,這意味着它只要一個挪用棧。如許它只能一次做一件事變。

挪用棧是一種數據組織,裏面會紀錄我們在順序中的也許位置。當實行進入一個函數,把它置於棧的頂部。假如從函數中返回則從棧頂部移除函數。這就是挪用棧所可以做的事變。

舉個栗子。檢察以下代碼:

function multiply(x, y) {
return x * y;
}
function printSquare(x) {
var s = multiply(x, x);
console.log(s);
}
printSquare(5);

當引擎最先實行這段代碼的時候,挪用棧會被清空。以後,發作以下步驟:

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

挪用棧中的每一個進口被稱為客棧組織。

當拋出非常的時候這正好是客棧追蹤是怎樣被組織出來的-當發作非常的時候這基本上是挪用棧的狀況。看下以下代碼:

function foo() {
throw new Error('SessionStack will help you resolve crashes:)');
}
function bar() {
foo();
}
function start() {
bar();
}
start();

假如在 Chrome 中實行(假定代碼在 foo.js 的文件中),將會發作以下的客棧追蹤:

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

“客棧溢出”-當你到達最大挪用棧大小的時候發作。這類狀況相稱容易發作,特別是當你運用遞歸而沒有細緻地搜檢代碼的時候。檢察下以下代碼:

function foo() {
foo();
}
foo();

當引擎最先實行這段代碼的時候,它最先挪用 foo 函數。這個函數,但是,會遞合併最先挪用其本身而沒有任何完畢前提。所以在每步實行歷程當中,挪用客棧會重複地增加一樣的函數。實行歷程以下所示:

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

在某一時候,但是,挪用客棧中的函數挪用次數超過了挪用客棧的現實大小,如許閱讀器決議拋出毛病的行動,以下所示:

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

在單線程中運轉代碼會相稱輕鬆因為你不必處置懲罰多線程環境中發作的一些龐雜狀況,比方死鎖。

然則在單線程運轉代碼也會有相稱的限定。因為 Javascript 只要一個挪用棧,假如運轉很慢會發作什麼?

併發和事宜輪迴

當你在挪用棧中有函數為了完成運轉須要斲喪大批的時候的時候會發作什麼?比方,設想一下你想要在閱讀器用 Javascript 來實行一些龐雜的圖象轉化。

你也許會問-為何這也是個題目?題目是如許確當挪用棧有函數須要實行,閱讀器現實上不能做別的任何事-它被壅塞了。這意味着閱讀器不可以實行襯着,它不可以運轉別的代碼,它卡住了。假如你想要在 app 中具有酷炫的流通 UI 體驗,這將會是個題目。

這不會是唯一的題目。一旦閱讀器最先在挪用棧中實行云云多的使命,閱讀器將會在相稱一段時候內住手交互。大多數閱讀器會拋出一個毛病,訊問你是不是封閉網頁。

《Javascript 事情道理之一-引擎,運行時,挪用客棧(譯)》

如今,這並非最好的用戶體驗,豈非不是嗎?

因而,怎樣不壅塞 UI 且不讓閱讀器住手相應來實行運轉遲緩的代碼呢?運用異步回調。

這將會在 『Javascript 事變道理』 第二章:『在V8 引擎中怎樣寫最好代碼的 5 條小技能』中舉行細緻論述。

本系列延續更新中,Github 地點請查閱這裏。


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
袁善恩芷恩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有