主流的js
環(huán)境都是單線程嗎模式執(zhí)行js 代碼, js
采用為單線程的原因與最開(kāi)始設(shè)計(jì)初衷有關(guān),最早是運(yùn)行在瀏覽器端的腳本語(yǔ)言,目的是為了實(shí)現(xiàn)頁(yè)面上的動(dòng)態(tài)交互,實(shí)現(xiàn)頁(yè)面交互的核心就是dom
操作,這也就決定了js
必須使用單線程的模式來(lái)處理,不然就會(huì)造成嚴(yán)重的線程同步問(wèn)題。如果js
多個(gè)線程同時(shí)修改dom
元素,此時(shí)瀏覽器就無(wú)法明確以那個(gè)線程的結(jié)果為準(zhǔn),為了避免這種線程同步問(wèn)題,所以從一開(kāi)始js就被設(shè)置成了單線程模式工作。這里所說(shuō)的單線程指的是javascript執(zhí)行環(huán)境中負(fù)責(zé)執(zhí)行代碼的線程只有一個(gè)
。
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、靖州網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、靖州網(wǎng)絡(luò)營(yíng)銷、靖州企業(yè)策劃、靖州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供靖州建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
可以想象成只有一個(gè)人來(lái)執(zhí)行任務(wù),一個(gè)人一次只能執(zhí)行一個(gè)任務(wù),如果有多個(gè)任務(wù)就需要排隊(duì)依次去完成。這種模式最大的優(yōu)點(diǎn)是更安全更簡(jiǎn)單,缺點(diǎn)也很明顯,遇到某一個(gè)特別耗時(shí)的任務(wù)后面的任務(wù)就需要等這個(gè)任務(wù)的結(jié)束,這也就導(dǎo)致整個(gè)程序的執(zhí)行的拖延,出現(xiàn)假死的情況。
為了結(jié)局耗時(shí)任務(wù)的問(wèn)題,javscript
把 任務(wù)的執(zhí)行分了兩種模式,分別是
Synchoronous
)Asynchronous
)Synchoronous
代碼依次執(zhí)行,后一個(gè)任務(wù)要等待前一個(gè)任務(wù)執(zhí)行完成,同步執(zhí)行比較簡(jiǎn)單,代碼的執(zhí)行順序就是代碼的順序。單線程大部分都是同步模式。
Console
是輸出的打印,Call stack
是執(zhí)行棧
開(kāi)始執(zhí)行 js 會(huì)把我們的整體的代碼加載進(jìn)來(lái)并放到一個(gè)匿名函數(shù)里面執(zhí)行,然后逐行開(kāi)始執(zhí)行,
第一行 執(zhí)行會(huì)把 console.log('global begin')
壓入調(diào)用棧中,控制臺(tái)打印global begin
執(zhí)行結(jié)束,彈出調(diào)用棧
接下來(lái)是兩個(gè)函數(shù)的聲明,函數(shù)的聲明不會(huì)產(chǎn)生調(diào)用所以接著往下執(zhí)行
接下來(lái)是一個(gè)foo
函數(shù)的調(diào)用,會(huì)把 foo
壓入調(diào)用棧,foo
函數(shù)打印了一個(gè)消息,接著執(zhí)行了 bar
函數(shù),bar
函數(shù)也會(huì)被放入執(zhí)行棧中,bar
函數(shù)執(zhí)行過(guò)程中又打印了一次,bar
執(zhí)行完畢彈出調(diào)用棧,緊接著 foo
函數(shù)也執(zhí)行結(jié)束,彈出調(diào)用棧
最后打印了一個(gè)消息,也是一樣的壓棧,整體代碼執(zhí)行完,執(zhí)行棧就會(huì)被清空掉
這種排隊(duì)執(zhí)行的機(jī)制下某行代碼執(zhí)行時(shí)間過(guò)長(zhǎng),后面的任務(wù)就會(huì)被延遲。我們把這種延遲稱為阻塞,這種阻塞對(duì)于用戶而言會(huì)有頁(yè)面卡頓或者叫卡死,所以需要異步模式來(lái)解決程序中無(wú)法避免的耗時(shí)操作,比如ajax
操作,或者nodejs
中的大文件讀寫(xiě)
更多內(nèi)容微信公眾號(hào)搜索
充饑的泡飯
小程序搜一搜開(kāi)水泡飯的博客