js 單執行緒 非同步

2022-06-01 08:03:07 字數 2258 閱讀 6128

執行緒與程序:

程序是系統資源分配和排程的單元。乙個執行著的程式就對應乙個程序。在windows中,每乙個開啟的執行的應用程式或後台程式,比如執行中的qq,谷歌瀏覽器,網易雲**,資源管理器等都是乙個程序。乙個程序包括了執行中的程式和程式所使用到的記憶體和系統資源。比如,邊聽**,邊在寫部落格,這 就是開了兩個程序。

同步和非同步:

同步非同步是指程式的行為。同步時程式發出呼叫的時候,一直等待直到返回結果。沒有結果之前不會返回。也就是說,同步是呼叫者主動等待呼叫的過程。

非同步是發出呼叫之後,馬上返回,但是不會馬上返回結果。呼叫者不必主動等待,當被呼叫者得到結果之後會主動通知呼叫者。

上面的概念可能比較官方,不易理解。通俗來說,就是,你去賣煎餅,然後再那等老闆做好之後遞給你,你才能走的過程 就是同步。你去肯德基點餐,然後點完之後,找個位置坐著玩手機,等做好後之後,前台的小哥哥小姐姐的叫號通知你去拿的過程就是非同步。同步就是 只能一件件的事情去做,做完一件,再做一件。而非同步不是,非同步是你再做一件事的等待過程中,可以去做其他的事情。這就是同步和非同步的區分。

console.log(1

)console.log('同步

')console.log(2)

//1//同步

//2

console.log(1

)settimeout(() => , 0)

console.log(2)//

1//2//

非同步

瀏覽器是單執行緒還是多執行緒?---多執行緒

乙個瀏覽器通常有以下幾個常駐的執行緒:

- 渲染引擎執行緒:顧名思義,該執行緒負責頁面的渲染。

- js引擎: 負責js的解析和執行

- 定時觸發器執行緒: 處理定時事件,比如settimeout,setinterval

- 事件觸發執行緒:處理dom事件

- 非同步http請求執行緒:處理http請求

瀏覽器只分配給js乙個主線程,用來執行任務,但是一次只能執行乙個任務,這些任務形成乙個任務佇列排隊等候執行,但是,前端的某些任務是很消耗時間的,如果,讓他們和別的任務一樣,都老老實實的排隊等待執行,執行效率就會非常的低,甚至導致頁面的假死。所以,瀏覽器為了這些耗時任務,就開闢了另外的執行緒,如: http請求,瀏覽器定時觸發器等,這些任務 都是非同步的,

那js 的單執行緒和非同步 是不是有點自相矛盾呢?單執行緒和非同步確實不能同時為乙個語言的特性,js 選擇了成為單執行緒語言,所以它本身不可能是非同步的,但js的宿主瀏覽器,node等是多執行緒的,宿主環境通過某種方式使得js具備了非同步的屬性。

任務佇列

js任務分為同步任務和非同步任務,同步任務指的是,在主線程上排隊執行的任務,只有錢乙個任務執行完畢,才能執行後乙個任務。非同步任務:不進入主線程,而進入「任務對列」的任務,只有「任務佇列」通知主線程,某個非同步任務可以執行了。該任務才會進入主線程執行。

非同步執行的執行機制:

- 所有的同步任務都在主線程上,形成乙個【執行棧】

- 主線程之外,還存在乙個「任務佇列」。只要非同步任務有了執行結果,就在「任務佇列」之中放置乙個事件。

- 一旦「執行棧」種的所有同步任務執行完畢,系統就會讀取「任務佇列」,看看裡面有哪些事件,那些對應的非同步任務,於是結束等待狀態,進入執行棧,開始執行。

- 主線程不斷重複上面的第三步。

**函式

當主線程開始執行非同步任務,就是執行對應的**函式。

非同步任務必須指定**函式。

js中的非同步之定時器

settimeout(function(),0)

console.log(

1);//1

//0

當有耗時任務的時候,會把它放在任務佇列中等待主線程空閒然後再執行。實際再執行的過程中,瀏覽器會預設settimeout以及ajax請求這一類的方法都是耗時程式(儘管可能不耗時)。所以此時的settimeout儘管它推遲時間為0,但是js不會立即執行,而是把它加入任務佇列,當執行完執行棧的同步任務也就是列印1後,再執行settimeout的**函式,列印0。

settimeout(fn,0)的含義是,指定某個任務在主線程最早可得的空閒時間執行。劃重點:::盡早可能。也就是說settimeout 將當前的**函式加入到任務佇列中,當前任務耗時過長,需要等很久,滅有辦法保證,**函式會在指定的時間內執行。

JS 非同步與單執行緒)

js 非同步與單執行緒 題目1.同步和非同步的區別是什麼,試舉例 例子見知識點 區別 1.同步會阻塞 執行,而非同步不會 2.alert 是同步,settimeout 是非同步 題目2.關於 settimeout 結果 1 3 5 2 4 題目3.前端使用非同步的場景有哪些 1.定時任務 setti...

JS非同步和單執行緒舉例

js 需要非同步的根本原因是 js 是單執行緒運 的,即在同 時間只能做 件事,不能 個 ajax 請求由於 絡 較慢,請求需要 5 秒鐘。如果是同步,這 5 秒鐘 就卡死在這 啥也做不了了。非同步的話,就好很多了,5 秒等待就等待了,其他事情不耽誤做,於那 5 秒鐘等待是 速太慢,不是因為 js ...

JS 演變 單執行緒 非同步任務

js是一門指令碼語言 解析型語言 弱型別語言 動態型別語言。歷史演變 js 作為一門指令碼語言,其執行環境 web瀏覽器 node adobe flash dom詳解 1.js 執行在瀏覽器中,是單執行緒的 2.瀏覽器是多執行緒的 3.瀏覽器中的 js 任務1.js主線程 由js引擎提供 2.js同...