欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分析JS單線程異步io回調(diào)的特性

 更新時間:2017年12月01日 14:08:06   投稿:laozhang  
這篇文章主要分析了javascript單線程異步io回調(diào)的特性這個問題,希望我們整理的內(nèi)容能幫助到你。

我們最開始接觸javascript應(yīng)該大部分是從html中的js腳本開始,但是這種看似簡單的語言稀里糊涂的用了好幾年,也沒有搞清楚它的一些原理機(jī)制,有沒有躺槍!

起碼javascript在操作dom的時候用了各種事件回調(diào),比如按鈕,鏈接的點擊,鼠標(biāo)經(jīng)過,獲取焦點等等.

在這個過程中,我們在dom上綁定一個事件回調(diào)函數(shù) 比如 onclick="doCheck()" 這個過程就是給dom元素注冊了一個click 事件,并且綁定了一個事件回調(diào)函數(shù) doCheck().

當(dāng)鼠標(biāo)點擊這個元素的時候,觸發(fā)了事件,馬上執(zhí)行事件綁定函數(shù)并回.

再后來是接觸到j(luò)query 的時候,大量的

$("#id").click(function(){
alert('點擊事件');
});

這種jquery的語法寫的越來越多似乎已經(jīng)習(xí)慣了,但是你是都留意過前面的選擇器只是選擇過濾dom節(jié)點,接著的click就是一個事件注冊,而里面的 function(){} 其實是一個參數(shù),事件綁定函數(shù)的參數(shù),這里面就要求你熟悉javascript的語法了.

function在javascript中是一個對象,對象就可以指世界的萬事萬物,所以對象可以包含很多屬性,方法等.

既然是對象,那就可以當(dāng)做一個參數(shù)去傳遞,這種函數(shù)叫做 高階函數(shù).

而且這種函數(shù)沒有定義名稱對不對,當(dāng)然你可以一個名稱,然后把名稱傳過來也是一樣的,但是沒有意義,因為這里的函數(shù)對象其實是一個形參,所以我們習(xí)慣的不給這種函數(shù)起名字,這就是常說的匿名函數(shù).

接著上面的$("#id").click 說起,當(dāng)點擊事件被觸發(fā)時,就要執(zhí)行事件綁定函數(shù).和上面直接在dom上給定onclick方法是一樣的效果.

假設(shè)瀏覽器里有多個線程去操作腳本的話,你能想象到他的亂嗎? 線程一正要去修改元素A的value值,結(jié)果沒想到線程二已經(jīng)把元素A從dom樹刪除節(jié)點,這時線程一只好操作失敗報錯.這樣的情況是不糟透了,要么瀏覽器無維護(hù)多個線程數(shù)據(jù)的一致性,要么前端工程師自己去維護(hù),所以......瀏覽器只有一個線程去操作dom,這樣省去了很多不必要的麻煩.

setTimeout(function(){
alert('彈出');
},300);

while(true){
	........
}

你覺得 300毫秒后 alert('彈出') 還有戲嗎?

沒有了,永遠(yuǎn)沒有戲了,等待300毫秒只是騙取你的感情的.因為瀏覽器是單線程模式執(zhí)行腳本.

一旦線程處于死循環(huán)模式下去執(zhí)行 while 語句,你的setTimeout 再也不會起任何作用了.

進(jìn)而我們走入了 node.js 世界,它完全保留了javascript在瀏覽器的特性,單線程異步回調(diào),也正是因為這個特點它才是它,假如node.js 是一門同步語言,就算所有的npm包都是 c++ 擴(kuò)展的(速度夠快吧)再快你也比不過c語言處理速度是不是,那么node.js可能還沒有出世就已經(jīng)被php鄙視了.

正是因為它的異步回調(diào)IO,更能提高他的效率,讓我想起以前學(xué)校的一種快餐店和學(xué)校食堂的對比情況:

食堂是所有學(xué)生拿著盤子在窗口排成一字型隊,打飯的妹妹一個一個盛好了,挨個端上飯走了.這是同步處理結(jié)果.

學(xué)校快餐店也是學(xué)生排隊點餐,但是點完餐拿上你的呼叫器就可以離開找位置去了.這樣單位時間內(nèi)服務(wù)員可以為很多人提供服務(wù),而且點好餐的同學(xué)可以找位置做自己其他事情,而不用傻傻地站到窗口等飯,直到你的飯出來的那一剎那,服務(wù)器會根據(jù)單號按下編碼,這時你桌上的呼叫器會響起,你去取餐就好了.這是異步處理.那個呼叫器響起就是觸發(fā)事件.

單線程可以減少多線程之間狀態(tài)切換引起的資源浪費和維護(hù)困難,當(dāng)然也有專門的第三方包來支持多核多線程的情景,你可以自己權(quán)衡.

以上就是關(guān)于JS單線程回調(diào)的全部信息內(nèi)容,如有大家在學(xué)習(xí)的時候還有其他的疑問,可以在下面的留言區(qū)域討論。

相關(guān)文章

  • 關(guān)于JavaScript反調(diào)試與混淆識別舉例詳解

    關(guān)于JavaScript反調(diào)試與混淆識別舉例詳解

    JS代碼混淆是一種保護(hù)代碼安全的重要手段,通過將代碼轉(zhuǎn)換為難以理解和閱讀的形式,增加代碼被盜用和逆向工程的難度,這篇文章主要介紹了關(guān)于JavaScript反調(diào)試與混淆識別的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • 微信小程序?qū)崿F(xiàn)簡單跑馬燈效果

    微信小程序?qū)崿F(xiàn)簡單跑馬燈效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡單跑馬燈效果 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 教你如何使用firebug調(diào)試功能了解javascript閉包和this

    教你如何使用firebug調(diào)試功能了解javascript閉包和this

    這篇文章主要介紹了教你如何使用firebug調(diào)試功能了解javascript閉包和this,javascript的調(diào)試也是一個比較大的難點,很多基礎(chǔ)的東西都需要自己去摸索,這里將自己的經(jīng)驗分享給大家,希望對大家能夠有所幫助
    2015-03-03
  • js實現(xiàn)聊天對話框

    js實現(xiàn)聊天對話框

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)聊天對話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 詳解JavaScript進(jìn)度管理

    詳解JavaScript進(jìn)度管理

    這篇文章主要介紹了JavaScript進(jìn)度管理,對進(jìn)度管理感興趣的同學(xué),可以參考下
    2021-04-04
  • Javascript中的for in循環(huán)和hasOwnProperty結(jié)合使用

    Javascript中的for in循環(huán)和hasOwnProperty結(jié)合使用

    當(dāng)檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務(wù)的方法,在 for in 循環(huán)時,建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯誤
    2013-06-06
  • js實現(xiàn)短信發(fā)送倒計時功能(正則驗證)

    js實現(xiàn)短信發(fā)送倒計時功能(正則驗證)

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)短信發(fā)送倒計時功能,包含正則驗證,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript中的全局對象介紹

    JavaScript中的全局對象介紹

    這篇文章主要介紹了JavaScript中的全局對象介紹,對于任何JavaScript程序,當(dāng)程序開始運(yùn)行時,JavaScript解釋器都會初始化一個全局對象以供程序使用,需要的朋友可以參考下
    2015-01-01
  • 微信小程序三級聯(lián)動地址選擇器的實例代碼

    微信小程序三級聯(lián)動地址選擇器的實例代碼

    本篇文章主要介紹了微信小程序三級聯(lián)動地址選擇器的實例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • 深入理解ES7的async/await的用法

    深入理解ES7的async/await的用法

    本篇文章主要介紹了深入理解ES7的async/await的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論