分析JS單線(xiàn)程異步io回調(diào)的特性
我們最開(kāi)始接觸javascript應(yīng)該大部分是從html中的js腳本開(kāi)始,但是這種看似簡(jiǎn)單的語(yǔ)言稀里糊涂的用了好幾年,也沒(méi)有搞清楚它的一些原理機(jī)制,有沒(méi)有躺槍!
起碼javascript在操作dom的時(shí)候用了各種事件回調(diào),比如按鈕,鏈接的點(diǎn)擊,鼠標(biāo)經(jīng)過(guò),獲取焦點(diǎn)等等.
在這個(gè)過(guò)程中,我們?cè)赿om上綁定一個(gè)事件回調(diào)函數(shù) 比如 onclick="doCheck()" 這個(gè)過(guò)程就是給dom元素注冊(cè)了一個(gè)click 事件,并且綁定了一個(gè)事件回調(diào)函數(shù) doCheck().
當(dāng)鼠標(biāo)點(diǎn)擊這個(gè)元素的時(shí)候,觸發(fā)了事件,馬上執(zhí)行事件綁定函數(shù)并回.
再后來(lái)是接觸到j(luò)query 的時(shí)候,大量的
$("#id").click(function(){ alert('點(diǎn)擊事件'); });
這種jquery的語(yǔ)法寫(xiě)的越來(lái)越多似乎已經(jīng)習(xí)慣了,但是你是都留意過(guò)前面的選擇器只是選擇過(guò)濾dom節(jié)點(diǎn),接著的click就是一個(gè)事件注冊(cè),而里面的 function(){} 其實(shí)是一個(gè)參數(shù),事件綁定函數(shù)的參數(shù),這里面就要求你熟悉javascript的語(yǔ)法了.
function在javascript中是一個(gè)對(duì)象,對(duì)象就可以指世界的萬(wàn)事萬(wàn)物,所以對(duì)象可以包含很多屬性,方法等.
既然是對(duì)象,那就可以當(dāng)做一個(gè)參數(shù)去傳遞,這種函數(shù)叫做 高階函數(shù).
而且這種函數(shù)沒(méi)有定義名稱(chēng)對(duì)不對(duì),當(dāng)然你可以一個(gè)名稱(chēng),然后把名稱(chēng)傳過(guò)來(lái)也是一樣的,但是沒(méi)有意義,因?yàn)檫@里的函數(shù)對(duì)象其實(shí)是一個(gè)形參,所以我們習(xí)慣的不給這種函數(shù)起名字,這就是常說(shuō)的匿名函數(shù).
接著上面的$("#id").click 說(shuō)起,當(dāng)點(diǎn)擊事件被觸發(fā)時(shí),就要執(zhí)行事件綁定函數(shù).和上面直接在dom上給定onclick方法是一樣的效果.
假設(shè)瀏覽器里有多個(gè)線(xiàn)程去操作腳本的話(huà),你能想象到他的亂嗎? 線(xiàn)程一正要去修改元素A的value值,結(jié)果沒(méi)想到線(xiàn)程二已經(jīng)把元素A從dom樹(shù)刪除節(jié)點(diǎn),這時(shí)線(xiàn)程一只好操作失敗報(bào)錯(cuò).這樣的情況是不糟透了,要么瀏覽器無(wú)維護(hù)多個(gè)線(xiàn)程數(shù)據(jù)的一致性,要么前端工程師自己去維護(hù),所以......瀏覽器只有一個(gè)線(xiàn)程去操作dom,這樣省去了很多不必要的麻煩.
setTimeout(function(){ alert('彈出'); },300); while(true){ ........ }
你覺(jué)得 300毫秒后 alert('彈出') 還有戲嗎?
沒(méi)有了,永遠(yuǎn)沒(méi)有戲了,等待300毫秒只是騙取你的感情的.因?yàn)闉g覽器是單線(xiàn)程模式執(zhí)行腳本.
一旦線(xiàn)程處于死循環(huán)模式下去執(zhí)行 while 語(yǔ)句,你的setTimeout 再也不會(huì)起任何作用了.
進(jìn)而我們走入了 node.js 世界,它完全保留了javascript在瀏覽器的特性,單線(xiàn)程異步回調(diào),也正是因?yàn)檫@個(gè)特點(diǎn)它才是它,假如node.js 是一門(mén)同步語(yǔ)言,就算所有的npm包都是 c++ 擴(kuò)展的(速度夠快吧)再快你也比不過(guò)c語(yǔ)言處理速度是不是,那么node.js可能還沒(méi)有出世就已經(jīng)被php鄙視了.
正是因?yàn)樗漠惒交卣{(diào)IO,更能提高他的效率,讓我想起以前學(xué)校的一種快餐店和學(xué)校食堂的對(duì)比情況:
食堂是所有學(xué)生拿著盤(pán)子在窗口排成一字型隊(duì),打飯的妹妹一個(gè)一個(gè)盛好了,挨個(gè)端上飯走了.這是同步處理結(jié)果.
學(xué)校快餐店也是學(xué)生排隊(duì)點(diǎn)餐,但是點(diǎn)完餐拿上你的呼叫器就可以離開(kāi)找位置去了.這樣單位時(shí)間內(nèi)服務(wù)員可以為很多人提供服務(wù),而且點(diǎn)好餐的同學(xué)可以找位置做自己其他事情,而不用傻傻地站到窗口等飯,直到你的飯出來(lái)的那一剎那,服務(wù)器會(huì)根據(jù)單號(hào)按下編碼,這時(shí)你桌上的呼叫器會(huì)響起,你去取餐就好了.這是異步處理.那個(gè)呼叫器響起就是觸發(fā)事件.
單線(xiàn)程可以減少多線(xiàn)程之間狀態(tài)切換引起的資源浪費(fèi)和維護(hù)困難,當(dāng)然也有專(zhuān)門(mén)的第三方包來(lái)支持多核多線(xiàn)程的情景,你可以自己權(quán)衡.
以上就是關(guān)于JS單線(xiàn)程回調(diào)的全部信息內(nèi)容,如有大家在學(xué)習(xí)的時(shí)候還有其他的疑問(wèn),可以在下面的留言區(qū)域討論。
相關(guān)文章
密碼強(qiáng)度檢測(cè)效果實(shí)現(xiàn)原理與代碼
密碼強(qiáng)度檢測(cè)有利于提醒增加密碼的安全指數(shù),更好的保護(hù)密碼安全,接下來(lái)介紹密碼強(qiáng)度檢測(cè)效果的實(shí)現(xiàn)2013-01-01利用Axios實(shí)現(xiàn)無(wú)感知雙Token刷新的詳細(xì)教程
在現(xiàn)代系統(tǒng)中,Token認(rèn)證已成為保障用戶(hù)安全的標(biāo)準(zhǔn)做法,然而,盡管許多系統(tǒng)采用了這種認(rèn)證方式,卻在處理Token刷新方面存在不足,導(dǎo)致用戶(hù)體驗(yàn)不佳,許多系統(tǒng)未能提供一種無(wú)縫的、用戶(hù)無(wú)感知的Token刷新機(jī)制,所以本文介紹了教你用Axios實(shí)現(xiàn)無(wú)感知雙Token刷新2024-08-08javascript實(shí)現(xiàn)鼠標(biāo)移到Image上方時(shí)顯示文字效果的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)鼠標(biāo)移到Image上方時(shí)顯示文字效果的方法,涉及javascript鼠標(biāo)事件及圖文屬性動(dòng)態(tài)設(shè)置的相關(guān)技巧,可用于為圖片增加文字提示效果,需要的朋友可以參考下2015-08-08taro 實(shí)現(xiàn)購(gòu)物車(chē)邏輯的實(shí)例代碼
這篇文章主要介紹了taro 實(shí)現(xiàn)購(gòu)物車(chē)邏輯,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06JavaScript數(shù)字和字符串轉(zhuǎn)換示例
這篇文章主要介紹了JavaScript數(shù)字和字符串轉(zhuǎn)換的應(yīng)用,需要的朋友可以參考下2014-03-03js實(shí)現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的三種方式
Blob對(duì)象表示一個(gè)不可變、原始數(shù)據(jù)的類(lèi)文件對(duì)象,Blob表示的不一定是JavaScript原生格式的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于js實(shí)現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的三種方式,需要的朋友可以參考下2023-04-04情人節(jié)專(zhuān)屬 純js腳本1k大小的3D玫瑰效果
用代碼做出的玫瑰花,這才是牛逼程序員送給女友的最好情人節(jié)禮物呢2012-02-02JavaScript 2048 游戲?qū)嵗a(簡(jiǎn)單易懂)
使用javascript制作的2048小游戲非常好玩,有意思,下面給大家分享使用javascript代碼制作的2048游戲,需要的朋友參考下吧2016-03-03ECMAScript6函數(shù)剩余參數(shù)(Rest Parameters)
這篇文章主要介紹了ECMAScript6函數(shù)剩余參數(shù)(Rest Parameters)的相關(guān)資料,需要的朋友可以參考下2015-06-06js實(shí)現(xiàn)按鈕控制帶有停頓效果的圖片滾動(dòng)
這篇文章主要介紹了js實(shí)現(xiàn)按鈕控制帶有停頓效果的圖片滾動(dòng),,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08