最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js前端面試之同步與異步問題詳解

 更新時(shí)間:2019年04月03日 11:50:38   作者:solvep  
這篇文章主要給大家介紹了關(guān)于js前端面試之同步與異步問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

我本來是打算寫一篇co源碼精讀(為啥讀co,因?yàn)樗?,然鵝發(fā)現(xiàn)自己存在一系列基礎(chǔ)問題沒有搞透徹,打算寫一個(gè)js基礎(chǔ)系列文章,總結(jié)自己的理解(copy),希望與你在學(xué)習(xí)路上一同進(jìn)步。首先問問自己當(dāng)面試官問到j(luò)s中的同步和異步,這個(gè)問題該怎么回答?理解一個(gè)問題無非是what-why-how

js同步和異步問題是什么-->為什么會(huì)產(chǎn)生異步問題-->如何解決。

一、JavaScript起源

技術(shù)的出現(xiàn),和應(yīng)用場(chǎng)景密切相關(guān)的。JavaScript誕生于1995年。當(dāng)時(shí),它的主要目的是處理以前由服務(wù)器端語言(如Perl)負(fù)責(zé)的一些輸入驗(yàn)證操作。在JavaScript問世之前,必須把表單數(shù)據(jù)發(fā)送到服務(wù)器端才能確定用戶是否沒有填寫某個(gè)必填域,是否輸入了無效的值。Netscape Navigator希望通過JavaScript來解決這個(gè)問題。起初名字為livescript,但是后來Netscape(網(wǎng)景)與Sun公司成立了一個(gè)開發(fā)聯(lián)盟。Netscape為了搭上媒體熱炒Java的順風(fēng)車,臨時(shí)把LiveScript改名為JavaScript,所以從本質(zhì)上來說JavaScript和Java沒什么關(guān)系(趁熱度)。

如今,JavaScript的用途早已不再局限于簡(jiǎn)單的數(shù)據(jù)驗(yàn)證,而是具備了與瀏覽器窗口及其內(nèi)容等幾乎所有方面交互的能力。今天的JavaScript已經(jīng)成為一門功能全面的編程語言

總結(jié):js最初的用途是為來實(shí)現(xiàn)用戶與瀏覽器的交互

二、JS為何是單線程的?

JavaScript的單線程,與它的用途有關(guān)。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來很復(fù)雜的同步問題。比如,假定JavaScript同時(shí)有兩個(gè)線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?

所以,為了避免復(fù)雜性,從一誕生,JavaScript就是單線程,這已經(jīng)成這門語言的核心特征,將來也不會(huì)改變。

注:所謂單線程,是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JavaScript代碼的線程只有一個(gè)。

三、計(jì)算機(jī)的同步與異步(重點(diǎn))

計(jì)算機(jī)領(lǐng)域中的同步(Synchronous)和異步(Asynchronous)和我們生活中的同步和異步的概念是恰好相反的,感覺是翻譯要背這個(gè)鍋。生活中的同步,突出的是‘同',相同的步伐,是咱倆一起行動(dòng),比如一起去逛街吃飯飯睡覺覺。異步則是你忙你的,我忙我的,步調(diào)不致且互不干擾。難到計(jì)算機(jī)里的同步和異步不是這樣?確實(shí)不是。

計(jì)算機(jī)的同步就好比:你去外地上學(xué)人生地不熟,突然生活費(fèi)不夠了;此時(shí)你決定打電話回家,通知家里轉(zhuǎn)生活費(fèi)過來,可是當(dāng)你撥出電話時(shí),對(duì)方一直處于待接聽狀態(tài)(即:打不通,聯(lián)系不上),為了拿到生活費(fèi),你就不停的oncall、等待,最終可能不能及時(shí)要到生活費(fèi),導(dǎo)致你今天要做的事都沒有完成,而白白花掉了時(shí)間。
計(jì)算機(jī)的異步就是:在你打完電話發(fā)現(xiàn)沒人接聽時(shí),猜想:對(duì)方可能在忙,暫時(shí)無法接聽電話,所以你發(fā)了一條短信(或者語音留言,亦或是其他的方式)通知對(duì)方后便忙其他要緊的事了;這時(shí)你就不需要持續(xù)不斷的撥打電話,還可以做其他事情;待一定時(shí)間后,對(duì)方看到你的留言便回復(fù)響應(yīng)你,當(dāng)然對(duì)方可能轉(zhuǎn)錢也可能不轉(zhuǎn)錢。但是整個(gè)一天下來,你還做了很多事情?;蛘哒f你找室友臨時(shí)借了一筆錢,又開始happy的上學(xué)時(shí)光了。

總結(jié):計(jì)算機(jī)中的同步就是排隊(duì)等待,假如你是第一百零一個(gè)備胎,那你只能等前面的一百個(gè)爆了之后才能‘處理'你。異步就是,盡管你是第一百零一個(gè),她還是能照顧到你的感受。

四、js單線程為什么會(huì)有'異步'問題

看完前面的鋪墊你是否會(huì)產(chǎn)生這些疑問,JS是單線程的,那么他是如何是實(shí)現(xiàn)異步操作的?AJAX異步發(fā)送和回調(diào)請(qǐng)求,還有setTimeout也看起來像是多線程的?不急慢慢來

  • js是同步的?

是的,單線程,那肯定只能同步(排隊(duì))執(zhí)行咯

  • js為什么需要異步?

如果JS中不存在異步,只能自上而下執(zhí)行,萬一上一行解析時(shí)間很長(zhǎng),那么下面的代碼就會(huì)被阻塞。

對(duì)于用戶而言,阻塞就意味著"卡死",這樣就導(dǎo)致了很差的用戶體驗(yàn)

  • js單線程又是如何實(shí)現(xiàn)異步的呢?

通過事件循環(huán)(event loop)實(shí)現(xiàn)'異步'

經(jīng)典問題:

 console.log('1')
setTimeout(function(){
 console.log('2')
},0)
console.log('3') 
// 1,3,2

也就是說,setTimeout里的函數(shù)并沒有立即執(zhí)行,而是延遲了一段時(shí)間,滿足一定條件后,才去執(zhí)行的,這類代碼,我們叫異步代碼。

所以,這里我們首先知道了JS里的一種分類方式,就是將任務(wù)分為: 同步任務(wù)和異步任務(wù)

雖然JS是單線程的但是瀏覽器的內(nèi)核是多線程的,在瀏覽器的內(nèi)核中不同的異步操作由不同的瀏覽器內(nèi)核模塊調(diào)度執(zhí)行,異步操作會(huì)將相關(guān)回調(diào)添加到任務(wù)隊(duì)列中。而不同的異步操作添加到任務(wù)隊(duì)列的時(shí)機(jī)也不同,如 onclick, setTimeout, ajax 處理的方式都不同,這些異步操作是由瀏覽器內(nèi)核的 webcore 來執(zhí)行的,webcore 包含上圖中的3種 webAPI,分別是 DOM Binding、network、timer模塊。

按照這種分類方式:JS的執(zhí)行機(jī)制是

  • 首先判斷js代碼是同步還是異步,同步就進(jìn)入主進(jìn)程,異步就進(jìn)入event table
  • 異步任務(wù)在event table中注冊(cè)函數(shù),當(dāng)滿足觸發(fā)條件后,被推入event queue
  • 同步任務(wù)進(jìn)入主線程后一直執(zhí)行,直到主線程空閑時(shí),才會(huì)去event queue中查看是否有可執(zhí)行的異步任務(wù),如果有就推入主進(jìn)程中

以上三步循環(huán)執(zhí)行,這就是event loop

總結(jié):同步可以保證順序一致,但是容易導(dǎo)致阻塞;異步可以解決阻塞問題,但是會(huì)改變順序性,根據(jù)不同的需要去寫你的代碼。

每周都會(huì)持續(xù)更新,您的點(diǎn)贊,收藏,關(guān)注三連擊是我的動(dòng)力。

決定了前方的路怎么走,就不要總回頭看,peace&love。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論

岑溪市| 揭西县| 台南市| 郯城县| 旅游| 于田县| 太原市| 汾西县| 浦县| 威信县| 从化市| 石城县| 儋州市| 景谷| 鄂伦春自治旗| 辽源市| 获嘉县| 岗巴县| 固原市| 天柱县| 渭南市| 泸州市| 仪陇县| 当涂县| 垣曲县| 贵定县| 诸城市| 杭锦后旗| 陈巴尔虎旗| 福清市| 呼玛县| 丰台区| 林芝县| 张家口市| 玛纳斯县| 区。| 桃江县| 饶阳县| 临安市| 淳化县| 刚察县|