最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

寫給小白的JavaScript引擎指南

 更新時(shí)間:2015年12月04日 11:11:49   投稿:mrr  
有時(shí)編寫 Web 應(yīng)用的代碼會(huì)感覺充滿魔力,因?yàn)槲覀冎皇菍懥艘幌盗凶址?,就能在瀏覽器里看到效果了。但是理解魔法背后的技術(shù),可以幫助你更好地提高編程技巧

關(guān)于本文標(biāo)題,我并不認(rèn)為參與寫或者讀本文的人是白癡。但是有時(shí)某個(gè)話題會(huì)讓你覺得自己就像個(gè)白癡一樣,而 JavaScript 引擎就是這些話題之一,至少對(duì)于我來說是這樣。

有時(shí)編寫 Web 應(yīng)用的代碼會(huì)感覺充滿魔力,因?yàn)槲覀冎皇菍懥艘幌盗凶址湍茉跒g覽器里看到效果了。但是理解魔法背后的技術(shù),可以幫助你更好地提高編程技巧。至少當(dāng)你試圖解釋在 JavaScript 驅(qū)動(dòng)的 web 或移動(dòng)應(yīng)用的幕后發(fā)生了什么的時(shí)候,會(huì)覺得自己不那么白癡了。

很多年前,那是我還是個(gè)研究生講師,向一個(gè)教授抱怨還沒有掌握那些特別難懂的法語語法點(diǎn),可以教給我的本科學(xué)生。我記得當(dāng)時(shí)她說的話:“有時(shí)候,學(xué)習(xí)某個(gè)事物的唯一方式就是教授它。”

嘗試向工程師解釋 NativeScript 是如何通過 JavaScript 引擎在幕后工作、在運(yùn)行時(shí)連接調(diào)用原生的 APIs——面對(duì)這樣一件復(fù)雜的工作很容易在一片雜草中迷失方向。事實(shí)上,任何 JavaScript 開發(fā)者都應(yīng)該對(duì)我們每天使用的這門技術(shù)基礎(chǔ)的引擎感到好奇。現(xiàn)在我們一起來仔細(xì)分析下 JavaScript 引擎到底做了什么,為什么不同的平臺(tái)使用不同引擎,多年來它們是如何發(fā)展的,以及作為開發(fā)者我們?yōu)槭裁匆P(guān)注這些。

首先,一些專業(yè)術(shù)語

“JavaScript 引擎”通常被稱作一種 虛擬機(jī)?!疤摂M機(jī)”是指軟件驅(qū)動(dòng)的給定的計(jì)算機(jī)系統(tǒng)的模擬器。有很多類型的虛擬機(jī),它們根據(jù)自己在多大程度上精確地模擬或代替真實(shí)的物理機(jī)器來分類。

例如,“系統(tǒng)虛擬機(jī)”提供了一個(gè)可以運(yùn)行操作系統(tǒng)的完整仿真平臺(tái)。Mac 用戶很熟悉的 Parallels 就是一個(gè)允許你在 Mac 上運(yùn)行 Windows系統(tǒng)虛擬機(jī)。

另一方面,“進(jìn)程虛擬機(jī)”不具備全部的功能,能運(yùn)行一個(gè)程序或者進(jìn)程。Wine 是一個(gè)允許你在 Linux 機(jī)器上運(yùn)行 Windows 應(yīng)用的進(jìn)程虛擬機(jī),但是并不在 Linux 中提供完整的 Windows 操作系統(tǒng)。

JavaScript 虛擬機(jī)是一種進(jìn)程虛擬機(jī),專門設(shè)計(jì)來解釋和執(zhí)行的 JavaScript 代碼。

注意:要區(qū)別在瀏覽器中排布頁面布局的 布局引擎 和解釋和執(zhí)行代碼的底層 JavaScript 引擎是非常重要的。在 這里 可以找到一個(gè)很好的闡釋。

那么,確切來講,到底什么是 JavaScript 引擎,它做了什么?

JavaScript 引擎的基本工作是把開發(fā)人員寫的 JavaScript 代碼轉(zhuǎn)換成高效、優(yōu)化的代碼,這樣就可以通過瀏覽器進(jìn)行解釋甚至嵌入到應(yīng)用中。事實(shí)上,JavaScriptCore 自稱為“優(yōu)化虛擬機(jī)”。

更準(zhǔn)確地講,每個(gè) JavaScript 引擎都實(shí)現(xiàn)了一個(gè)版本的 ECMAScript,JavaScript 是它的一個(gè)分支。隨著 ECMAScript 的不斷發(fā)展,JavaScript 引擎也不斷改進(jìn)。之所以有這么多不同的引擎,是因?yàn)樗鼈兠總€(gè)都被設(shè)計(jì)運(yùn)行在不同的 web 瀏覽器、headless 瀏覽器、或者像 Node.js 那樣的運(yùn)行時(shí)環(huán)境中。

你也許熟悉 web 瀏覽器,那什么是 headless 瀏覽器呢?它是一個(gè)沒有圖形用戶界面的 web 瀏覽器。它們?cè)趯?duì) web 產(chǎn)品進(jìn)行自動(dòng)化測(cè)試時(shí)十分有用。一個(gè)很棒的例子就是 PhantomJS。那 Node.js 又和 JavaScript 引擎有什么關(guān)系?Node.js 是一個(gè)異步的、事件驅(qū)動(dòng)的框架,讓你在服務(wù)器端可以使用 JavaScript。既然他們是驅(qū)動(dòng) JavaScript 的工具,所以它們也是由 JavaScript 引擎驅(qū)動(dòng)。

按照上述關(guān)于虛擬機(jī)的定義,把 JavaScript 引擎稱作進(jìn)程虛擬機(jī)就很好理解了,因?yàn)樗奈ㄒ坏哪康木褪亲x取和編譯 JavaScript 代碼。這并不意味著它只是個(gè)簡(jiǎn)單的引擎。比如,JavaScriptCore 就有六個(gè)“構(gòu)建模塊”可以分析、解釋、優(yōu)化、垃圾回收 JavaScript 代碼。

它是如何工作的?

當(dāng)然,這決定于引擎。吸引我們注意的兩個(gè)主要的引擎都利用了 NativeScript ,它們分別是 WebKit 的 JavaScriptCore 和 Google 的 V8 引擎。這兩個(gè)引擎使用不同的方式處理代碼。

JavaScriptCore 執(zhí)行 一系列步驟 來解釋和優(yōu)化腳本:

它進(jìn)行詞法分析,就是將源代碼分解成一系列具有明確含義的符號(hào)或字符串。
然后用語法分析器分析這些符號(hào),將其構(gòu)建成語法樹。
接著四個(gè) JIT(Just-In-Time)進(jìn)程開始參與進(jìn)來,分析和執(zhí)行解析器所生成的字節(jié)碼。
什么?簡(jiǎn)單來說,JavaScript 引擎會(huì)加載你的源代碼,把它分解成字符串(又叫做分詞),再 把這些字符串轉(zhuǎn)換 成編譯器可以理解的字節(jié)碼,然后執(zhí)行這些字節(jié)碼。

Google 的 V8 引擎 是用 C++ 編寫的,它也能夠編譯并執(zhí)行 JavaScript 源代碼、處理內(nèi)存分配和垃圾回收。它被設(shè)計(jì)成由兩個(gè)編譯器組成,可以把源碼直接編譯成機(jī)器碼:

Full-codegen:輸出未優(yōu)化代碼的快速編譯器
Crankshaft: 輸出執(zhí)行效率高、優(yōu)化過的代碼的慢速編譯器
如果 Crankshaft 確定需要優(yōu)化的代碼是由 Full-codegen 生成的未優(yōu)化代碼,它就會(huì)取代 Full-codegen,這個(gè)過程叫做“crankshafting”。

一旦編譯過程中產(chǎn)生了機(jī)器代碼,引擎就會(huì)向?yàn)g覽器暴露所有的數(shù)據(jù)類型、操作符、對(duì)象、在 ECMA 標(biāo)準(zhǔn)中指定的函數(shù)、或任何運(yùn)行時(shí)需要使用的東西,NativeScript 就是如此。

有哪些 JavaScript 引擎?

有一大堆令人眼花繚亂的 JavaScript 引擎可以用來解釋、分析和執(zhí)行你的客戶端代碼。每個(gè)瀏覽器版本發(fā)布時(shí),它的 JavaScript 引擎都可能有所改變或優(yōu)化以跟上 JavaScript 代碼執(zhí)行技術(shù)的狀況的變化。

你還沒被這些瀏覽器引擎的名字完全弄糊涂之前,請(qǐng)記住很多市場(chǎng)營(yíng)銷的元素被加入了這些引擎和以它們?yōu)榛A(chǔ)的瀏覽器。這篇對(duì) JavaScript 編譯 十分有用的分析 中,作者諷刺地指出:“你所不知道的是,編譯器大約有 37% 是由市場(chǎng)營(yíng)銷構(gòu)成的,對(duì)編譯器進(jìn)行品牌重塑也是你能做的為數(shù)不多的事情之一,智慧的市場(chǎng)營(yíng)銷,故而有了一系列名字:SquirrelFish、Nitro、SFX……”。

在牢記營(yíng)銷對(duì)命名和重命名這些引擎的影響的同時(shí),注意到幾件在 JavaScript 引擎發(fā)展史上的重大事件是很有用的。我為你做了一個(gè)便于理解的圖表:

Browser, Headless Browser, or Runtime JavaScript Engine
Mozilla Spidermonkey
Chrome V8
Safari JavaScriptCore
IE and Edge Chakra
PhantomJS JavaScriptCore
HTMLUnit Rhino
TrifleJS V8
Node.js V8
Io.js* V8

*JavaScriptCore 被改寫為 SquirrelFish,升級(jí)版本為 QuirrelFish Extreme,也叫做 Nitro。然而,構(gòu)成 Webkit 實(shí)現(xiàn)基礎(chǔ)的 JavaScript 引擎就是 JavaScriptCore(比如 Safari)。

**iOS 開發(fā)者應(yīng)該要知道移動(dòng)設(shè)備的 Safari 使用 Nitro,但是 UIWebView 不包括 JIT 編譯,所以體驗(yàn)會(huì)慢一些。然而開發(fā)人員可以在 iOS8 中使用包含 Nitro 的 WKWebView,使用體驗(yàn) 明顯 變快?;旌弦苿?dòng)應(yīng)用程序的開發(fā)人員應(yīng)該能松口氣了。

*最終 io.js 從 Node.js 分離開的原因之一就是為了支持 V8 版本的引擎。這仍然是一個(gè)挑戰(zhàn),正如 這里 講述的。

我們?yōu)槭裁匆P(guān)注?

JavaScript 引擎的代碼解析和執(zhí)行過程的目標(biāo)就是在最短時(shí)間內(nèi)編譯出最優(yōu)化的代碼。

最重要的是,這些引擎的演進(jìn)與我們對(duì)發(fā)展 web 和 移動(dòng)平臺(tái)的不斷探究息息相關(guān),讓它們盡可能具有高性能,是相輔相成的。為了追蹤這種演進(jìn),你可以看到各種各樣的引擎在基準(zhǔn)圖中是如何表現(xiàn)的,就好像 arewefastyet.com 總結(jié)的。例如,比較 Chrome 在搭載 V8 引擎與 non-Crankshafted 引擎時(shí)的表現(xiàn)就很有趣。

任何一個(gè) web 開發(fā)者都要意識(shí)到,我們努力編寫、調(diào)試和維護(hù)的代碼在不同瀏覽器中執(zhí)行效果必然有所差異。為什么某段代碼在一個(gè)瀏覽器上工作得很慢,但在另一個(gè)上卻快得多?

同樣地,移動(dòng)開發(fā)者,尤其是使用 webview 顯示頁面內(nèi)容的混合移動(dòng)應(yīng)用開發(fā)者,或者那些使用像 NativeScript 這種運(yùn)行時(shí)環(huán)境的開發(fā)者,想知道是什么引擎在解釋執(zhí)行他們的 JavaScript 代碼。移動(dòng) web 開發(fā)者應(yīng)該注意到那些小小設(shè)備上的瀏覽器所具備的各種局限性和可能性。作為一個(gè)想持續(xù)發(fā)展的 web、移動(dòng)或應(yīng)用程序開發(fā)人員,時(shí)刻關(guān)注 JavaScript 引擎的變化會(huì)帶給你超值回報(bào)。

總結(jié):

js 中的基本數(shù)據(jù)類型 undefined null boolean number string
js 中的一種復(fù)雜數(shù)據(jù)類型 object  它是所有對(duì)象的基礎(chǔ)類型
js 和其他語言一樣擁有9種基本的控制語句
js 中的函數(shù)無需指定返回值,實(shí)際上未指定返回值的函數(shù)返回的是undefined
js 中的參數(shù)可以隨意的傳遞  注意arguments[] 數(shù)組 它可以幫助你
js 中的函數(shù)是不能重載的,但是你可以模仿。

相關(guān)文章

  • JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼

    JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 使用Mock.js生成前端測(cè)試數(shù)據(jù)

    使用Mock.js生成前端測(cè)試數(shù)據(jù)

    這篇文章主要介紹了使用Mock.js生成前端測(cè)試數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JS原型鏈怎么理解

    JS原型鏈怎么理解

    本文重點(diǎn)給大家介紹javascript中的原型鏈知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-06-06
  • JavaScript動(dòng)態(tài)添加事件之事件委托

    JavaScript動(dòng)態(tài)添加事件之事件委托

    動(dòng)態(tài)添加事件實(shí)質(zhì)就是指js中的事件委托。本文給大家介紹JavaScript動(dòng)態(tài)添加事件之事件委托的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-07-07
  • 在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁和數(shù)據(jù)交互的方法

    在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁和數(shù)據(jù)交互的方法

    今天小編大家分享一篇在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁和數(shù)據(jù)交互的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • javascript客戶端遍歷控件與獲取父容器對(duì)象示例代碼

    javascript客戶端遍歷控件與獲取父容器對(duì)象示例代碼

    本篇文章主要是對(duì)javascript客戶端遍歷控件與獲取父容器對(duì)象示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • 微信小程序 仿美團(tuán)分類菜單 swiper分類菜單

    微信小程序 仿美團(tuán)分類菜單 swiper分類菜單

    本文主要介紹了微信小程序仿美團(tuán)分類菜單(swiper分類菜單)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • 微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽

    微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • JavaScript中用字面量創(chuàng)建對(duì)象介紹

    JavaScript中用字面量創(chuàng)建對(duì)象介紹

    這篇文章主要介紹了JavaScript中用字面量創(chuàng)建對(duì)象介紹,本文直接給出代碼實(shí)例,并講解了一些技巧,需要的朋友可以參考下
    2014-12-12
  • JavaScript中的for循環(huán)與雙重for循環(huán)詳解

    JavaScript中的for循環(huán)與雙重for循環(huán)詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript中for循環(huán)與雙重for循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

尼木县| 永济市| 鄂托克前旗| 宁都县| 平乐县| 全州县| 望奎县| 荆门市| 福安市| 新郑市| 宁海县| 淅川县| 宣恩县| 霞浦县| 额尔古纳市| 古交市| 舟曲县| 石阡县| 泰顺县| 板桥市| 鹤峰县| 孝义市| 安龙县| 蕉岭县| 连州市| 建瓯市| 江阴市| 普定县| 盱眙县| 井研县| 河津市| 南漳县| 静海县| 曲水县| 徐水县| 罗山县| 拉萨市| 安国市| 平湖市| 淮阳县| 韩城市|