国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript工作原理(一):引擎,運(yùn)行時(shí),調(diào)用堆棧

Jingbin_ / 475人閱讀

摘要:調(diào)用棧是一種單線程編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用棧。這就是調(diào)用棧的功能。簡(jiǎn)單代碼示例當(dāng)引擎執(zhí)行這段代碼時(shí),調(diào)用棧為空,之后運(yùn)行如下每個(gè)叫做堆棧幀。調(diào)用棧就是通過(guò)堆棧幀來(lái)追蹤異常,堆棧幀基本就是調(diào)用棧出現(xiàn)異常時(shí)候的狀態(tài)。

概述

幾乎每個(gè)人都已經(jīng)聽(tīng)說(shuō)過(guò)V8引擎這個(gè)概念,而且大多人都知道JavaScript是單線程的,并且使用回調(diào)隊(duì)列

這篇文章中,我們將詳細(xì)介紹這些概念,并解釋JavaScript實(shí)際運(yùn)行的原理。通過(guò)了解這些詳細(xì)信息,將能夠編寫(xiě)更好的非阻塞應(yīng)用程序,以正確利用所提供的API。

JavaScript引擎

最流行的JavaScript引擎莫過(guò)于Google的V8引擎,V8使用C++開(kāi)發(fā),Chrome瀏覽器和Node.js都是基于V8引擎的,簡(jiǎn)略的示意圖:

V8引擎包含兩個(gè)主要組件:
內(nèi)存堆(Memory Heap):負(fù)責(zé)內(nèi)存分配
調(diào)用棧(Call Stack):代碼執(zhí)行時(shí),維護(hù)堆棧幀(Stack Frames)

運(yùn)行時(shí)

幾乎所有的JavaScript開(kāi)發(fā)者都使用過(guò)setTimeout這樣的API,然而這些APIs不是由V8引擎提供的。那這些APIs是哪來(lái)的呢?

盡管我們已經(jīng)有了V8引擎,但實(shí)際上我們還需要更多的接口或功能。我們把那些由瀏覽器提供的接口稱(chēng)為Web APIs,比如DOM,AJAX,setTimeout等等。

接下來(lái)是事件循環(huán)(event lool)和回調(diào)隊(duì)列(callback queue)。

調(diào)用棧(Call Stack)

JavaScript是一種單線程編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用棧。因此,在同一時(shí)間它只能做一件事。

調(diào)用棧是一個(gè)數(shù)據(jù)結(jié)構(gòu),它會(huì)記錄代碼執(zhí)行的位置。例如我們執(zhí)行進(jìn)入一個(gè)函數(shù),我們會(huì)把這個(gè)函數(shù)放在堆棧的頂部,函數(shù)執(zhí)行結(jié)束返回之后,我們把這個(gè)函數(shù)從堆棧中移除。這就是調(diào)用棧的功能。

簡(jiǎn)單代碼示例:

function multiply(x, y) {
    return x * y;
}

function printSquare(x) {
    var s = nultiply(x, x);
    console.log(s);
}

printSquare(5);

當(dāng)引擎執(zhí)行這段代碼時(shí),調(diào)用棧為空,之后運(yùn)行如下:

每個(gè)Step叫做堆棧幀(Stack Frame)。

調(diào)用棧就是通過(guò)堆棧幀來(lái)追蹤異常,堆棧幀基本就是調(diào)用棧出現(xiàn)異常時(shí)候的狀態(tài)。示例代碼如下:

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

function bar() {
    foo();
}

function start() {
    bar();
}

假設(shè)上面代碼保存在foo.js文件,執(zhí)行上面代碼在Chrome瀏覽器中,Error的堆棧信息會(huì)如下圖打印出來(lái):

單線程執(zhí)行代碼是無(wú)法充分利用CPU資源,使得運(yùn)行效率低。由于JavaScript只有一個(gè)調(diào)用棧,如果運(yùn)行效率變低,那應(yīng)該怎么解決呢?

并發(fā)和事件循環(huán)

想像一下如果調(diào)用棧里面有些函數(shù)的執(zhí)行需要大量的時(shí)間,例如在瀏覽器中進(jìn)行復(fù)雜的圖片轉(zhuǎn)化,情況會(huì)怎么樣,為什么會(huì)有問(wèn)題?

問(wèn)題就是調(diào)用棧中的函數(shù)在執(zhí)行的過(guò)程中,瀏覽器是不能做其它事情的,也就是會(huì)被調(diào)用棧中的函數(shù)阻塞,此時(shí)瀏覽器不能渲染和運(yùn)行其它代碼,完全被卡住了。這樣就很難實(shí)現(xiàn)流暢的UIs體驗(yàn)。

而且另外一個(gè)問(wèn)題也會(huì)由此發(fā)生,如果瀏覽器在調(diào)用棧中執(zhí)行很多這樣復(fù)雜且耗時(shí)的函數(shù)時(shí),瀏覽器也會(huì)失去響應(yīng),出現(xiàn)假死狀態(tài)。

這絕對(duì)不是我們要的用戶(hù)體驗(yàn)。

怎么才能執(zhí)行復(fù)雜且耗時(shí)的代碼,并且不會(huì)阻塞UI的渲染和導(dǎo)致瀏覽器假死呢?解決方案就是異步調(diào)用。異步調(diào)用會(huì)在第二篇系列文章(V8引擎和5招優(yōu)化)中解釋。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94596.html

相關(guān)文章

  • JavaScript 工作原理引擎,運(yùn)行時(shí),調(diào)用堆棧(譯)

    摘要:本章會(huì)對(duì)語(yǔ)言引擎,運(yùn)行時(shí),調(diào)用棧做一個(gè)概述。調(diào)用棧只是一個(gè)單線程的編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用棧。查看如下代碼當(dāng)引擎開(kāi)始執(zhí)行這段代碼的時(shí)候,調(diào)用棧會(huì)被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個(gè)入口被稱(chēng)為堆棧結(jié)構(gòu)。 原文請(qǐng)查閱這里,本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原...

    Betta 評(píng)論0 收藏0
  • JavaScript 工作原理引擎,運(yùn)行時(shí)調(diào)用堆棧(譯)

    摘要:本章會(huì)對(duì)語(yǔ)言引擎,運(yùn)行時(shí),調(diào)用棧做一個(gè)概述。調(diào)用棧只是一個(gè)單線程的編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用棧。查看如下代碼當(dāng)引擎開(kāi)始執(zhí)行這段代碼的時(shí)候,調(diào)用棧會(huì)被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個(gè)入口被稱(chēng)為堆棧結(jié)構(gòu)。 原文請(qǐng)查閱這里,本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原...

    Alex 評(píng)論0 收藏0
  • JavaScript是如何工作的:引擎,運(yùn)行時(shí)調(diào)用堆棧的概述!

    摘要:調(diào)用棧是一種單線程編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用堆棧。調(diào)用棧是一種數(shù)據(jù)結(jié)構(gòu),它記錄了我們?cè)诔绦蛑械奈恢?。而且這不是唯一的問(wèn)題,一旦你的瀏覽器開(kāi)始處理調(diào)用棧中的眾多任務(wù),它可能會(huì)停止響應(yīng)相當(dāng)長(zhǎng)一段時(shí)間。 本文是旨在深入研究JavaScript及其實(shí)際工作原理的系列文章中的第一篇:我們認(rèn)為通過(guò)了解JavaScript的構(gòu)建塊以及它們是如何工作的,將能夠編寫(xiě)更好的代碼和應(yīng)用程序。我們還將分...

    PiscesYE 評(píng)論0 收藏0
  • 前端進(jìn)階系列(七):什么是執(zhí)行上下文?什么是調(diào)用棧?

    摘要:什么是中的調(diào)用棧調(diào)用棧就像是程序當(dāng)前執(zhí)行的日志。當(dāng)函數(shù)執(zhí)行結(jié)束時(shí),將從調(diào)用棧中出去。了解全局和局部執(zhí)行上下文是掌握作用域和閉包的關(guān)鍵??偨Y(jié)引擎創(chuàng)建執(zhí)行上下文,全局存儲(chǔ)器和調(diào)用棧。 原文作者:Valentino 原文鏈接:https://www.valentinog.com/blog/js-execution-context-call-stack 什么是Javascript中的執(zhí)行上下文...

    leone 評(píng)論0 收藏0
  • JS引擎:它們是如何工作的?從調(diào)用堆棧到Promise,需要知道的所有內(nèi)容

    摘要:最受歡迎的引擎是,由和使用,用于,以及使用的。引擎它們是如何工作的全局執(zhí)行上下文和調(diào)用堆棧剛剛了解了引擎如何讀取變量和函數(shù)聲明,它們最終被放入了全局內(nèi)存堆中。事件循環(huán)只有一個(gè)任務(wù)它檢查調(diào)用堆棧是否為空。 為了保證可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 有沒(méi)有想過(guò)瀏覽器如何讀取和運(yùn)行JS代碼? 這看起來(lái)很神奇,我們可以通過(guò)瀏覽...

    lavnFan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<