日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS 单线程

發(fā)布時間:2024/4/15 javascript 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS 单线程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

js單線程阻塞實例
setTimeout(function () { while (true) { } }, 1000);
setTimeout(function () { alert('end 2'); }, 2000);
setTimeout(function () { alert('end 1'); }, 100);
alert('end');
結(jié)果是彈出’end’、’end 1’,然后瀏覽器假死,就是不彈出‘end 2’。

?

js單線程重點:
JS 是單線程的,但是卻能執(zhí)行異步任務,
這主要是因為 JS 中存在事件循環(huán)(Event Loop)和任務隊列(Task Queue)。


事件循環(huán):
JS 會創(chuàng)建一個類似于 while (true) 的循環(huán),
每執(zhí)行一次循環(huán)體的過程稱之為 Tick。
每次 Tick 的過程就是查看是否有待處理事件,
如果有則取出相關事件及回調(diào)函數(shù)放入執(zhí)行棧中由主線程執(zhí)行。
待處理的事件會存儲在一個任務隊列中,
也就是每次 Tick 會查看任務隊列中是否有需要執(zhí)行的任務。


任務隊列:
異步操作會將相關回調(diào)添加到任務隊列中。
而不同的異步操作添加到任務隊列的時機也不同,如 onclick, setTimeout, ajax 處理的方式都不同,
這些異步操作是由瀏覽器內(nèi)核的 webcore 來執(zhí)行的。
onclick 由瀏覽器內(nèi)核的 DOM Binding 模塊來處理,
當事件觸發(fā)的時候,回調(diào)函數(shù)會立即添加到任務隊列中。
setTimeout 會由瀏覽器內(nèi)核的 timer 模塊來進行延時處理,
當時間到達的時候,才會將回調(diào)函數(shù)添加到任務隊列中。
ajax 則會由瀏覽器內(nèi)核的 network 模塊來處理,
在網(wǎng)絡請求完成返回之后,才將回調(diào)添加到任務隊列中。


主線程:
JS 只有一個線程,稱之為主線程。
而事件循環(huán)是主線程中執(zhí)行棧里的代碼執(zhí)行完畢之后,才開始執(zhí)行的。
所以,主線程中要執(zhí)行的代碼時間過長,會阻塞事件循環(huán)的執(zhí)行,也就會阻塞異步操作的執(zhí)行。
只有當主線程中執(zhí)行棧為空的時候(即同步代碼執(zhí)行完后),才會進行事件循環(huán)來觀察要執(zhí)行的事件回調(diào),
當事件循環(huán)檢測到任務隊列中有事件就取出相關回調(diào)放入執(zhí)行棧中由主線程執(zhí)行。

轉(zhuǎn)載于:https://www.cnblogs.com/justSmile2/p/10764297.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結(jié)

以上是生活随笔為你收集整理的JS 单线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。