四虎国产精品永久地址998_chinesexxx少妇露脸_日本丁香久久综合国产精品_一区二区久久久久_四虎av影视_久久久久国产一区二区三区不卡

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁 > IT資訊 > 軟件研發(fā) > JavaScript是單線程語言嗎?

JavaScript是單線程語言嗎?

2020-07-21 14:43:12 | 來源:中培企業(yè)IT培訓(xùn)網(wǎng)

如果使用Java腳本已有一段時(shí)間,則可能會碰到它是一種單線程語言的短語。那么JavaScript是單線程語言嗎?Javascript引擎在具有內(nèi)存堆和調(diào)用堆棧的V8引擎上運(yùn)行。JS是一個(gè)單線程,這意味著一次只執(zhí)行一個(gè)語句。在我們深入研究它在單線程上運(yùn)行的含義之前。我想先介紹一下可以幫助您理解的術(shù)語。本文將以最簡單的方式進(jìn)行解釋。為了更好地理解這一點(diǎn),需要了解一種稱為堆棧的數(shù)據(jù)結(jié)構(gòu)。

同步執(zhí)行通常是指按順序執(zhí)行的代碼。在同步編程中,程序一行一行地執(zhí)行,一次一行。每次調(diào)用一個(gè)函數(shù)時(shí),程序執(zhí)行都會等到該函數(shù)返回后再繼續(xù)執(zhí)行下一行代碼。舉例來說,您正在呼叫某人,并且正在等待他們接聽,以便您可以與他們交談。在他們拿起電話之前,您沒有做任何其他事情,可以順序執(zhí)行請求。

const one() => {

const two() => {

console.log('5');

}

two();

}

那么,在調(diào)用堆棧下會發(fā)生什么呢?

調(diào)用堆棧的工作是填寫指令并在執(zhí)行指令時(shí)彈出指令。

Javascript是一種單線程語言,可以是非阻塞的。單線程意味著它只有一個(gè)調(diào)用堆棧。調(diào)用堆棧頂部的所有內(nèi)容都將首先運(yùn)行。

在以上程序中,功能按順序運(yùn)行。

如果我們有一項(xiàng)繁重的工作需要怎么辦?我們應(yīng)該讓用戶等到該過程結(jié)束嗎?

const one() {

console.log("Hello");

}const two () {

for(i=0; i<= 100000000000000000000000; i++){

}const three(){

console.log("World");

}

one();

two();

three();

考慮上面的示例,如果我們的第二個(gè)函數(shù)必須循環(huán)遍歷大量數(shù)字該怎么辦。這是否意味著three()必須等到執(zhí)行two()。

在我們的小示例中,這可能并不意味著什么,但是如果我們必須在一個(gè)真實(shí)的項(xiàng)目中實(shí)施,那么在第一個(gè)過程完成之前,用戶可能無法執(zhí)行任何操作。

異步執(zhí)行是指未按照代碼中出現(xiàn)的順序運(yùn)行。在異步編程中,程序不會等待任務(wù)完成,而是可以繼續(xù)執(zhí)行下一個(gè)任務(wù)。

舉個(gè)例子:您打電話給某人,而在等待他們接聽電話的同時(shí),您也在跑腿。

不同的語言有不同的方式來實(shí)現(xiàn)異步。最受歡迎的是通過多線程。簡而言之,Java通過創(chuàng)建一個(gè)子線程來實(shí)現(xiàn)多線程,該子線程執(zhí)行自己的單獨(dú)執(zhí)行,然后與父線程合并回去。但是,這可能會遇到稱為死鎖的問題,可以使用各種防止死鎖的機(jī)制來解決。

從那以后,我們關(guān)注用Java腳本實(shí)現(xiàn)異步。讓我們看看我們?nèi)绾巫龅竭@一點(diǎn)。嘗試在控制臺中運(yùn)行它,看看會發(fā)生什么。

console.log('1');

setTimeout(()=> {console.log('2')}, 3000);console.log('3');

  您可能會看到1或者3并短暫出現(xiàn)2。為什么會這樣呢?

簡而言之,JavaScript的異步實(shí)現(xiàn)是通過調(diào)用堆棧,回調(diào)隊(duì)列以及Web API和事件循環(huán)來完成的。

如我們前面所見,調(diào)用堆棧作業(yè)是檢查堆棧頂部的指令并執(zhí)行它。

事件循環(huán)的作用是連續(xù)檢查是否發(fā)生了事件,例如單擊鼠標(biāo)或鍵盤擊鍵,以便將其發(fā)送到調(diào)用堆棧。當(dāng)然,您希望鼠標(biāo)單擊的執(zhí)行優(yōu)先于圖像加載。

在Javascript中,所有指令都放在調(diào)用堆棧中。當(dāng)執(zhí)行指針到達(dá)setTimeout時(shí),引擎將其視為Web API指令并將其彈出并發(fā)送給Web API,并且調(diào)用堆棧將繼續(xù)執(zhí)行其余指令。完成Web API的執(zhí)行后,它將到達(dá)回調(diào)隊(duì)列。

引擎檢查調(diào)用堆棧是否為空。如果為空,則在我們的情況下檢查回調(diào)隊(duì)列,其中有setTimeout的響應(yīng)。回調(diào)隊(duì)列將其發(fā)送到回調(diào)堆棧,并執(zhí)行指令。

考慮此問題的另一種方法是在發(fā)出API請求時(shí)。假設(shè)您的網(wǎng)站需要從服務(wù)器獲取圖像。您的網(wǎng)站是否應(yīng)該在圖像到達(dá)之前拒絕加載其他部分?那將是糟糕的用戶體驗(yàn)。

當(dāng)調(diào)用堆棧看到它需要獲取圖像時(shí),它將彈出并發(fā)送到WebAPI,然后繼續(xù)執(zhí)行其余功能。圖像請求的響應(yīng)存儲在調(diào)用堆棧隊(duì)列中。

當(dāng)調(diào)用堆棧為空時(shí),連續(xù)運(yùn)行的事件循環(huán)將查看調(diào)用堆棧隊(duì)列(如果有)。如果是這樣,則在我們的情況下是圖像請求的響應(yīng)。它將其放在調(diào)用堆棧上并執(zhí)行指令。

此過程的好處是JavaScript無需擔(dān)心CPU正在運(yùn)行多少個(gè)內(nèi)核或節(jié)點(diǎn)。此實(shí)現(xiàn)只有一個(gè)調(diào)用堆棧。以上就是關(guān)于JavaScript是單線程語言嗎的全部內(nèi)容,想了解更多關(guān)于JavaScript的信息,請繼續(xù)關(guān)注我們吧。

標(biāo)簽: JavaScript 單線程語言
主站蜘蛛池模板: 思南县| 民和| 三河市| 雷山县| 湖南省| 手机| 冷水江市| 天津市| 嘉义市| 澄江县| 开化县| 息烽县| 双鸭山市| 鄂尔多斯市| 达孜县| 牡丹江市| 揭阳市| 陇南市| 汤原县| 寿光市| 河池市| 儋州市| 烟台市| 台南市| 常宁市| 瓦房店市| 房产| 合山市| 西城区| 惠水县| 嘉定区| 保康县| 东城区| 玉山县| 庆城县| 西宁市| 顺昌县| 怀来县| 乐至县| 泰兴市| 尚义县|