當前位置:
首頁 > 知識 > 如果一個函數作為另一個函數參數使用,那麼這函數叫做回調函數

如果一個函數作為另一個函數參數使用,那麼這函數叫做回調函數

回調函數可以看成,讓別人做事,傳進去的額外信息。

比如,A 讓 B 做事,根據粒度不同,可以理解成 A 函數調用 B 函數,或者 A 類使用 B 類,或者 A 組件使用 B 組件等等。反正就是 A 叫 B 做事。

當 B 做這件事情的時候,自身的需要的信息不夠,而 A 又有。就需要 A 從外面傳進來,或者 B 做著做著主動向外面申請。對於 B 來說,一種被動得到信息,一種是主動去得到信息,有人給這兩種方式術語,叫信息的 push,和信息的 pull。

當 B 做這件事情的時候,自身的需要的信息不夠,而 A 又有。就需要 A 從外面傳進來,或者 B 做著做著主動向外面申請。對於 B 來說,一種被動得到信息,一種是主動去得到信息,有人給這兩種方式術語,叫信息的 push,和信息的 pull。

我們暫停一下,看看計算機中比較詭異的地方,也就是代碼(code)和數據(data)的統一。這是一個檻,如果不打通這個,很多概念就不清楚。我們常常說計算機程序分成 code 和 data 兩部分。很多人就會覺得,code 是會運行的,是動的,data 是給 code 使用,是靜態的,這是兩種完全不同的東西。

其實 code 只是對行為的一種描述,比如有個機器人可以開燈,關燈,掃地。如果跟機器人約定好,0 表示開燈,1 表示關燈,2 表示掃地。我發出指令串,0 1 2,就可以控制機器人開燈,關燈,掃地。再約定用二進位表示,兩位一個指令,就有一個數字串,000111,這個時候 000111 這串數字就描述了機器人的一系列動作,這個就是從一方面理解是 code,它可以控制機器人的行為。但另一方面,它可以傳遞,可以記錄,可以修改,也就是數據。只要大家都協商好,code 就可以編碼成 data, 將 data 解釋運行的時候,也變成了 code。

其實 code 只是對行為的一種描述,比如有個機器人可以開燈,關燈,掃地。如果跟機器人約定好,0 表示開燈,1 表示關燈,2 表示掃地。我發出指令串,0 1 2,就可以控制機器人開燈,關燈,掃地。再約定用二進位表示,兩位一個指令,就有一個數字串,000111,這個時候 000111 這串數字就描述了機器人的一系列動作,這個就是從一方面理解是 code,它可以控制機器人的行為。但另一方面,它可以傳遞,可以記錄,可以修改,也就是數據。只要大家都協商好,code 就可以編碼成 data, 將 data 解釋運行的時候,也變成了 code。

另外有些語言不單可以傳遞函數,函數裡面又用到一些外部信息(包括code, data)。那些語言可以將函數跟函數所用到的信息一起傳遞存儲。這種將函數和它所用的信息作為一個整體,就為閉包。

將代碼和數據打通,統一起來。過了這個檻,很多難以理解的概念就會清晰很多。

現在我們再回頭看看回調函數。回調函數也就是是 A 讓 B 做事,B 做著做著,信息不夠,不知道怎麼做了,就再讓外面處理。

比如上述排序例子,A 讓 B 排序,B 會做排序,但排序需要知道哪個比哪個大,這點 B 自己不知道,就需要 A 告訴它。而這種判斷那個大,本身是一種動作,既然 C 語言中不可以傳進第一值的函數,就設計成傳遞第二值的函數指針,這個函數指針就是 A 傳向 B 的信息,用來表示一個行為。這裡本來 A 調用 B 的,結果 B 又調用了 A 告訴它的信息,也就叫 callback。

再比如 A 讓 B 監聽系統的某個消息,比如敲了哪個鍵。跟著 B 監聽到了,但它不知道怎麼去處理這個消息,就給外面關心這個消息,又知道怎麼去處理這個消息的人去處理,這個處理過程本身是個行為,既然這個語言不可以傳遞函數,又只能傳一個函數指針了。假如我將函數指針存儲下來,以後就可以隨時調用。代碼和數據都是信息,數據可以存儲下來,用來表示行為的函數自然也可以存儲下來。

其實你理解了,根本不用去關心術語的。術語是別人要告訴你啊,或者你去告訴人啊,使用的一套約定的詞語。本質上就這個東西,結果會有很多術語的。

將代碼和數據打通,統一起來。過了這個檻,很多難以理解的概念就會清晰很多。

現在我們再回頭看看回調函數。回調函數也就是是 A 讓 B 做事,B 做著做著,信息不夠,不知道怎麼做了,就再讓外面處理。

比如上述排序例子,A 讓 B 排序,B 會做排序,但排序需要知道哪個比哪個大,這點 B 自己不知道,就需要 A 告訴它。而這種判斷那個大,本身是一種動作,既然 C 語言中不可以傳進第一值的函數,就設計成傳遞第二值的函數指針,這個函數指針就是 A 傳向 B 的信息,用來表示一個行為。這裡本來 A 調用 B 的,結果 B 又調用了 A 告訴它的信息,也就叫 callback。

再比如 A 讓 B 監聽系統的某個消息,比如敲了哪個鍵。跟著 B 監聽到了,但它不知道怎麼去處理這個消息,就給外面關心這個消息,又知道怎麼去處理這個消息的人去處理,這個處理過程本身是個行為,既然這個語言不可以傳遞函數,又只能傳一個函數指針了。假如我將函數指針存儲下來,以後就可以隨時調用。代碼和數據都是信息,數據可以存儲下來,用來表示行為的函數自然也可以存儲下來。

其實你理解了,根本不用去關心術語的。術語是別人要告訴你啊,或者你去告訴人啊,使用的一套約定的詞語。本質上就這個東西,結果會有很多術語的。

你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到電話後就到店裡去取了貨。在這個例子里,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店裡後來有貨了叫做觸發了回調關聯的事件,店員給你打電話叫做調用回調函數,你到店裡去取貨叫做響應回調事件。

如果一個函數作為另一個函數參數使用,那麼這函數叫做回調函數

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Spring 定時任務Scheduled 開發詳細圖文
小白推演HIVE資料庫的優化思路

TAG:程序員小新人學習 |