成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

給女朋友講了講 V8 引擎的“回調函數”!

開發 前端
今天主要和大家分享了 JavaScript 中回調函數的由來和異步回調函數的設計,這也是 V8 引擎中的一小部分

回調函數相信大家并不陌生,但是對于女朋友來說比較陌生,要想給女朋友講明白回調函數是怎么回事,為什么要這樣設計,使用回調函數應該注意什么,確實不容易,所以有了這篇文章。

在 JavaScript 中,我個人覺得理解回調函數,就有助于我們理解 JavaScript 中的其它設計,比如異步編程、消息循環、一些常用到的 Web API 以及 Node 中的異步,這些都與回調函數息息相關,所以咱們一步步的來學習和使用。

廢話不多說,直接上干貨!

[[348215]]

什么是回調函數?

回調函數也是函數的一種,回調函數與普通函數的區別在于它的調用時機。所謂的回調函數是把一個函數當作另一個函數的參數,并在這個函數的某個時機進行調用,我們就將這個傳入的函數稱為回調函數。

回調函數分為同步回調和異步回調。它倆的區別在于調用的位置不同。

1. 同步回調

所謂的同步回調函數是在執行的函數內部被調用的。舉個例子:

  1. function fn(){ 
  2.     console.log("我是同步回調函數"); 
  3.  
  4. function bar(f){ 
  5.      f(); 
  6.  
  7. bar(fn); 

我們聲明了一個回調函數 fn,我們傳入 bar 函數,我們在 bar 內部調用了 fn,此時就是同步調用。

2. 異步回調

而異步回調函數是在執行的函數外部被調用的。如下代碼:

  1. function fn(){ 
  2.     console.log("我是異步回調函數"); 
  3.  
  4. settimeout(fn, 1000); 

上述代碼中,settimeout 的第一個參數 fn 是傳入的一個回調函數,當程序執行 1000 ms 的時候,此時這個回調函數被調用,而且是在 setTimeout 函數外部被調用的,我們稱 fn 為異步回調函數。

JS 線程架構

上述的問題理解起來非常簡單,尤其是同步回調函數。但是對于異步回調函數什么時候被調用的,是在什么位置被調用的,我們目前是非常模糊的。

所以要想知道異步回調函數的調用時機和位置,我們需要理解 JS 的線程架構,比如消息隊列、事件循環,從根上理解 JS 是如何設計這些東西的。

JS 的最初設計是單線程的,所謂的單線程就是同一時間只能干一件事情,而且 JS 運行的這個單線程就是頁面的 UI 線程,畢竟 JS 為了能夠更方便的操作 DOM 嘛。

那么問題來了,當我們把 JS 設計到 UI 頁面線程,就會出現一個問題,當用戶通過頁面交互產生一個事件時,如果當前的線程正在處理其他的任務,那么這個交互事件需要等當前 UI 線程的任務處理完畢才能被處理,所以這樣設計比較雞肋。

如果當前 UI 線程一直執行其他任務,那么這個用戶的交互事件任務一直不被處理,會出現頁面點擊無效的假象。

谷歌 V8 團隊為了解決這個問題,那么就引入了消息隊列。

消息隊列

有了消息隊列,我們把所有產生的事件,無論是 JavaScript 產生的事件還是用戶點擊頁面交互產生的事件,都統一按照先后循序放到消息隊列中,那么 UI 線程就不斷的循環這個消息隊列,有任務就取出來去執行。

有了消息隊列之后,這個主線程就可以有序的執行各種事件任務了。

異步任務什么時候調用?

還是上述的 setTimeout 異步回調函數的例子,假如當前線程在消息隊列中取出 setTimeout 這段代碼執行,發現 fn 這個任務是在 1000 ms 后執行的,1000 ms 過后,主線程就會將 fn 封裝成一個事件任務扔到消息隊列中去等待被執行。

等消息隊列中的執行到一定的時機,就會取出這個被封裝過的 fn 回調函數任務,在主線程中被執行。

這個理解起來并不是很難,但是有一類回調函數比較特殊。當主線程在消息隊列中取出一個網絡下載的任務時,網絡下載比較耗時,我們不可能讓它在主線程中阻塞其他任務執行,所以主線程就會交給網絡線程去執行這個下載任務,然后主線程回繼續有序的在消息隊列中取出其他任務執行。

此時網絡線程會接受到這個任務執行下載操作,當網絡線程把文件下載完畢之后,就將下載的結果封裝成一個事件任務,放入到消息隊列中。當主線程執行到這個任務時,就知道網絡線程已經下載完了,然后將下載的結果呈現給用戶。

最后

好了,今天主要和大家分享了 JavaScript 中回調函數的由來和異步回調函數的設計,這也是 V8 引擎中的一小部分,接下來會通過這樣一個個的知識點,挖掘 V8 谷歌引擎的各個方面的優秀設計方案。

 

責任編輯:趙寧寧 來源: 小鹿動畫學編程
相關推薦

2021-06-22 07:45:57

React18startTransiReact

2021-06-22 07:30:07

React18Automatic b自動批處理

2022-10-24 09:11:05

TypeScriptV8

2021-10-21 08:31:31

Spring循環依賴面試

2019-03-12 09:43:14

反向代理正向代理服務器

2022-06-02 12:02:12

V8C++JavaScript

2021-03-05 17:06:53

全排列組合子集

2019-04-09 09:40:23

2020-03-16 14:08:59

線程熔斷限流

2023-10-10 10:23:50

JavaScriptV8

2021-09-14 12:00:11

VR字節跳動

2019-10-09 10:45:16

云計算Web互聯網

2009-08-21 10:09:02

Google ChroV8引擎linux系統

2009-07-20 09:36:04

谷歌瀏覽器安全漏洞

2021-03-09 12:27:05

微服務 微服務架構應用程序

2010-07-20 16:35:52

V8JavaScript瀏覽器

2023-06-07 16:00:40

JavaScriptV8語言

2019-11-28 10:53:19

程序員技能開發者

2015-08-26 10:17:29

程序員女朋友

2019-12-23 10:26:02

3PC分布式2PC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 武道仙尊动漫在线观看 | 日本在线视 | 免费在线观看一区二区 | 亚洲成人av在线 | 欧美日韩精品久久久免费观看 | 欧美精品在线播放 | 亚洲成人a v | 国产精品久久二区 | 最大av在线 | 亚洲成人免费网址 | 日本三级全黄三级三级三级口周 | 欧美久久一区 | 日韩欧美成人精品 | 日韩播放 | 天天亚洲 | 国产91精品网站 | 久久大陆 | 日韩视频高清 | 日韩一区二区三区视频 | 看毛片网站 | 精品91视频| 亚洲综合在线视频 | 国产高清视频一区 | 日日夜夜天天综合 | 亚洲影视在线 | 久久久久亚洲精品 | 欧洲高清转码区一二区 | 成人乱人乱一区二区三区软件 | 亚洲欧美日韩久久 | 伊人伊成久久人综合网站 | 精品一区二区久久久久久久网站 | 久久久精品一区二区三区 | 亚洲精品区| 91视频一区二区三区 | 欧美91| 久久国产电影 | 亚洲精品一区二区在线观看 | 久久久久久国产精品 | 九九精品在线 | 国产精品成人av | 午夜国产 |