JavaScript同步與異步
在JavaScript中同步與異步是非常重要的兩個(gè)概念输虱,首先在這兒做一個(gè)總體概述,然后再詳細(xì)說明
同步:往簡(jiǎn)單了說窗怒,就是在同一時(shí)間JavaScript只能做一件事
異步:同樣的異步就是JavaScript可以在同一時(shí)間做兩件以上的事写半,在做這件事的同時(shí),還可以做另一件事
首先必須說明一點(diǎn)埃难,JavaScript的在設(shè)計(jì)之初就注定了他必須是同步的,(也就是單線程的)涤久,而不能是異步的涡尘,為啥不能是異步的呢?大家想一個(gè)問題响迂,你寫了個(gè)JavaScript文件考抄,代碼里面操作了一個(gè)DOM元素(比如:修改它的背景顏色),接下來你又想刪除了這個(gè)DOM元素蔗彤,假入JavaScript是異步的川梅,也就是說在同一時(shí)間可以同時(shí)執(zhí)行這兩件事,那么到底是修改呢然遏,還是刪除呢贫途?不知道?所以JavaScript必須是同步的
同步有什么好處呢 待侵?代碼執(zhí)行較為清晰丢早,邏輯比較簡(jiǎn)單,但是因?yàn)槭峭降难砬悖a必須從上往下一行一行的執(zhí)行香拉,執(zhí)行到某一行,假如遇到了一個(gè)ajax請(qǐng)求中狂,這個(gè)請(qǐng)求時(shí)間比較長(zhǎng),在這段時(shí)間里后面的代碼又執(zhí)行不了扑毡,cpu也處于空閑狀態(tài)胃榕,勢(shì)必造成了資源的浪費(fèi)
異步的好處? 遇到異步請(qǐng)求,可以繼續(xù)往下執(zhí)行勋又,不需要等待苦掘,有效的利用了資源,節(jié)省了時(shí)間
JavaScript的代碼執(zhí)行機(jī)制
var a = 1;
var b = 3;
var c = a + b;
var d = setTimeOut(function(){
alert(111)楔壤;
}鹤啡,3000)
console.log(c);
JavaScript代碼從上往下一行一行去執(zhí)行,以上代碼為例說明:
首先執(zhí)行第一行代碼蹲嚣,OK第一行代碼進(jìn)入執(zhí)行隊(duì)列去執(zhí)行递瑰,(在內(nèi)存里開辟一塊空間命名為a保存一個(gè)數(shù)值為1),執(zhí)行完畢后隙畜,第一行代碼出隊(duì)列
第二行代碼進(jìn)去執(zhí)行隊(duì)列去執(zhí)行抖部,(在內(nèi)存里開辟一塊空間命名為b保存一個(gè)數(shù)值為3),執(zhí)行完畢后议惰,第二行代碼出隊(duì)列
第三行代碼依次去執(zhí)行慎颗,只不過第三行代碼會(huì)從內(nèi)存里加載a , b變量的值言询,然后做加法運(yùn)算俯萎,執(zhí)行完了之后,第三行代碼出隊(duì)列
第四行依次走运杭,進(jìn)入隊(duì)列夫啊,執(zhí)行隊(duì)列一看是時(shí)間函數(shù),瞬間將時(shí)間函數(shù)扔進(jìn)異步隊(duì)列里面县习,異步隊(duì)列會(huì)檢測(cè)時(shí)間函數(shù)的時(shí)間涮母,3秒之后會(huì)將時(shí)間函數(shù)的回掉函數(shù)扔進(jìn)可執(zhí)行隊(duì)列(可執(zhí)行隊(duì)列里面有一個(gè)事件循環(huán)機(jī)制,在主隊(duì)列為空的情況下躁愿,會(huì)將可執(zhí)行隊(duì)列的代碼加載到執(zhí)行隊(duì)列里去執(zhí)行)
最后一行進(jìn)入執(zhí)行隊(duì)列去執(zhí)行叛本,執(zhí)行完畢出隊(duì)列
最后的執(zhí)行結(jié)果肯定是先控制臺(tái)輸出4,然后再?gòu)棾?11
- 這就是JavaScript的同步單線程機(jī)制彤钟,在同一時(shí)刻執(zhí)行隊(duì)列中只能執(zhí)行一條命令也就是只能做一件事来候,執(zhí)行完了,出隊(duì)列逸雹,后面的命令才能進(jìn)入執(zhí)行隊(duì)列