电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript運(yùn)行機(jī)制實(shí)例分析

瀏覽:3日期:2023-11-04 14:10:41

本文實(shí)例講述了JavaScript運(yùn)行機(jī)制。分享給大家供大家參考,具體如下:

第一次寫博客

目前研一第二學(xué)期,大二開始入門前端,然而長久以來都是對(duì)于框架的簡單調(diào)用,并未對(duì)其進(jìn)行深入研究,因此,這個(gè)博客是作為自我督促的開始。這篇博客的內(nèi)容源于前段時(shí)間寫一個(gè)微信小程序前端,發(fā)現(xiàn)頁面的渲染順序總與自己的預(yù)想相違背,因此近期看了一些關(guān)于JavaScript運(yùn)行機(jī)制的博客及文檔,有了一些基本的框架,接下來就來詳細(xì)看一下我所了解到的內(nèi)容。

JavaScript執(zhí)行順序

首先,JavaScript是按照順序,一行一行執(zhí)行的,且JS只有一條線程,即不可能進(jìn)行兩條代碼同時(shí)執(zhí)行,也就是說,在一條代碼執(zhí)行時(shí),它后面的所有代碼都需要等待,直到該代碼執(zhí)行結(jié)束,后面的才能繼續(xù)執(zhí)行。如果是這樣,就會(huì)導(dǎo)致用戶體驗(yàn)度極其不好,例如一個(gè)請(qǐng)求發(fā)送給服務(wù)器,后續(xù)代碼就會(huì)一直等待,直到服務(wù)器返回結(jié)果,用戶才能進(jìn)行新的操作。

這又是怎么回事呢?

詳細(xì)解釋JavaScript執(zhí)行機(jī)制JavaScript執(zhí)行棧

JavaScript是以壓棧的方式進(jìn)行代碼的執(zhí)行的,一開始執(zhí)行時(shí)棧內(nèi)為空,當(dāng)執(zhí)行開始,JS引擎會(huì)將代碼放入棧底,若該代碼包含其他函數(shù)的調(diào)用,則將被調(diào)用的函數(shù)放在棧頂,若該代碼未包含其他函數(shù)的調(diào)用,則執(zhí)行該函數(shù),執(zhí)行完成后出棧,以此類推,最終直到棧為空。

JavaScript的同步任務(wù)和異步任務(wù)

事實(shí)上,真正的JS內(nèi)部分為同步任務(wù)和異步任務(wù),然而這并沒有改變JS單線程的特征。

同步任務(wù):執(zhí)行后直接返回結(jié)果,例:console.log();c = a + b 異步任務(wù):執(zhí)行后無法立刻返回結(jié)果,需要等待一定時(shí)間,才能執(zhí)行回調(diào)函數(shù),對(duì)返回結(jié)果進(jìn)行操作

系統(tǒng)來說,JS存在一個(gè)主線程,它會(huì)首先執(zhí)行所有同步任務(wù),而異步任務(wù)都會(huì)先進(jìn)行注冊(cè),然后主線程不會(huì)等待異步任務(wù)執(zhí)行結(jié)果的返回,而是繼續(xù)執(zhí)行下面的同步任務(wù)(在此過程中,如果異步任務(wù)返回結(jié)果,接下來的回調(diào)函數(shù)會(huì)放在Event Queue中等待),直到同步任務(wù)全部執(zhí)行完畢,主線程就會(huì)從Event Queue讀取任務(wù)進(jìn)行執(zhí)行。該過程會(huì)不斷循環(huán),即事件循環(huán)Event Loop。

事件循環(huán)是如何發(fā)生的

不覺得奇怪嗎,如果按照上述同步任務(wù)和異步任務(wù)的執(zhí)行方式,那不是一輪就可以執(zhí)行完畢嗎,又何來的Event Loop?

這是個(gè)小細(xì)節(jié),異步任務(wù)存在多個(gè)時(shí),每一個(gè)異步任務(wù)返回的結(jié)果所需的時(shí)間都是不同的,這就存在Event Queue以先進(jìn)先出的形式將返回結(jié)果進(jìn)行排隊(duì),第一個(gè)異步任務(wù)返回結(jié)果,那么就將其放在隊(duì)列的首位,接下來的異步任務(wù)緊隨其后,就這樣排成一隊(duì)。當(dāng)主線程空閑時(shí)(即同步任務(wù)執(zhí)行完畢后),便從Event Queue中讀取事件,放入主線程執(zhí)行。而循環(huán)來自于,當(dāng)Event Queue執(zhí)行完畢后,過了一段時(shí)間,又有之前的異步任務(wù)返回結(jié)果,放到Event Queue中,監(jiān)控器檢測到Event Queue為非空,主線程又開始執(zhí)行Event Queue中的任務(wù)。

宏任務(wù)和微任務(wù)

在解釋定義之前,我們先對(duì)異步任務(wù)進(jìn)行說明:

對(duì)服務(wù)器的異步請(qǐng)求:最常見的異步任務(wù),這涉及前后端的交互,需要服務(wù)器對(duì)請(qǐng)求進(jìn)行處理,并返回請(qǐng)求結(jié)果 setTimeout和setInterval:延時(shí)操作,后者為循環(huán)操作(都涉及延時(shí)值) Promise:JS用來處理異步操作的對(duì)象 process.nextTick(callback):類似node.js版的'setTimeout',在事件循環(huán)的下一次循環(huán)中調(diào)用 callback 回調(diào)函數(shù)。

廣義上JS分為同步任務(wù)和異步任務(wù),在此對(duì)任務(wù)進(jìn)行更精細(xì)的定義:

macro-task(宏任務(wù)):包括整體代碼script,setTimeout,setInterval micro-task(微任務(wù)):Promise,process.nextTick

在此,之所以提出宏任務(wù)和微任務(wù),是為了更好的理解事件循環(huán)!

執(zhí)行過程:

主線程會(huì)按順序先執(zhí)行第一次循環(huán)的宏任務(wù),然后將第一次循環(huán)遇到的微任務(wù)放入微任務(wù)的Event Queue中,將遇到的宏任務(wù)放入宏任務(wù)Event Queue中,在此特別注意!!第一次循環(huán)的宏任務(wù)是整體script代碼!!; 然后后執(zhí)行微任務(wù)的Event Queue; 第二次循環(huán)時(shí),會(huì)從宏任務(wù)的Event Queue中取出第一個(gè)宏任務(wù),然后執(zhí)行當(dāng)前宏任務(wù)中包含的代碼,同樣將遇到的微任務(wù)放入微任務(wù)的Event Queue中,將遇到的宏任務(wù)放入宏任務(wù)Event Queue中; 再執(zhí)行當(dāng)前微任務(wù)的Event Queue中的任務(wù); 第三次循環(huán),從宏任務(wù)的Event Queue中取出第二個(gè)宏任務(wù)…(以此循環(huán))

簡而言之,就是先執(zhí)行宏任務(wù),再執(zhí)行微任務(wù),特別注意兩點(diǎn)即可:

第一次循環(huán)的宏任務(wù)是整體script代碼 宏任務(wù)隊(duì)列是一次循環(huán)執(zhí)行一條宏任務(wù)

這里看個(gè)例子:

console.log(’1’); setTimeout(function() { console.log(’2’); process.nextTick(function() { console.log(’3’); }) new Promise(function(resolve) { console.log(’4’); resolve(); }).then(function() { console.log(’5’) }) }) process.nextTick(function() { console.log(’6’); }) new Promise(function(resolve) { console.log(’7’); resolve(); }).then(function() { console.log(’8’) }) setTimeout(function() { console.log(’9’); process.nextTick(function() { console.log(’10’); }) new Promise(function(resolve) { console.log(’11’); resolve(); }).then(function() { console.log(’12’) }) }) //作者:ssssyoki //鏈接:https://juejin.im/post/59e85eebf265da430d571f89 //來源:掘金

輸出順序?yàn)椋?/p>

1,7,6,8,2,4,3,5,9,11,10,12

總結(jié)

在此博客中,或許包含一些你未曾聽過的名詞或方法,我并未對(duì)其進(jìn)行詳細(xì)解釋。之所以如此,是由于,于我個(gè)人,在看一些資料時(shí),經(jīng)常遇到不懂的東西,我會(huì)選擇自己進(jìn)行查閱和理解,這樣更有效于記憶和通透的理解,就跟查單詞是一樣的,如果文本里直接告訴你,反而不會(huì)重視。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 酸度计_PH计_特斯拉计-西安云仪 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 共享雨伞_共享童车_共享轮椅_共享陪护床-共享产品的领先者_有伞科技 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 直流大电流电源,燃料电池检漏设备-上海政飞| 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 企业VI设计_LOGO设计公司_品牌商标设计_【北京美研】 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 上海logo设计| 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 光环国际-新三板公司_股票代码:838504 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 健康管理师报考条件,考试时间,报名入口—首页 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 非甲烷总烃分析仪|环控百科 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 福建自考_福建自学考试网| 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 宠物店加盟_宠物连锁店_开宠物店-【派多格宠物】 |