回調函數 callback 的實現原理是什麼?

大家好,我是小風哥。

在講正文前閒聊幾句,最近實在是有點忙,昨天已經是近期第二次通宵加班了,之前加班發到朋友圈後收到了很多同學的關心,很是感動,感謝大家:

公司忙起來後的確有時加班挺狠的,但這不是常態,在這裏也提醒大家千萬不要熬夜,對身體健康真的不好,能不加班就不加班,早睡早起,身體是一切的基礎。

其實之前小風哥寫過關於回調函數原理的文章,在這裏《10 張圖讓你徹底理解回調函數》,這篇文章內容很全面,但還是有很多同學在微信上問我有沒有簡化版的,以下就是回調函數原理的極簡版。

其實回調函數和普通函數沒有本質的區別。

首先讓我們來看看普通的函數調用,假設我們在 A 函數中調用函數 func:

void A() {
   ...
   func();
   ...
}

想一想,你怎麼知道可以調用 func 呢?哦,原來 func 是你自己定義的:

void func() {
  blablabla;
}

這很簡單吧,現在假設你編寫的這段代碼無比之牛逼,全世界的程序員都無比瘋狂的想引入到自己的項目中,這時你會把 A 函數編寫成一個庫供全世界的碼農使用。

但此時所有人都發現一個問題,那就是他們都想在 A 函數中的某個特定點上執行一段自己的代碼,作爲這個庫的創作者你可能會這樣實現:

void A() {
   ...
   // 特定點
   if (張三) {
     funcA();
   } else if (李四) {
     funcB();
   }
   ...
}

假設全世界有一千萬碼農,那你是不是要有一千萬個 if else。。。想想這樣的代碼就很刺激有沒有!

更好的辦法是什麼呢?把函數也當做變量!你可以這樣定義 A 函數:

void A(func f) {
   ...
   f();
   ...
}

任何一個碼農在調用你的 A 函數時傳入一個函數變量,A 函數在合適的時機調用你傳入的函數變量,從而節省了一千萬行代碼

爲了讓這個過程更加難懂一些,這個函數變量起了一個無比難懂的稱呼:回調函數。

現在你應該明白了回調函數是怎麼一回事了吧,相比回調函數來說我更願意將其看做函數變量

以上就是回調函數的基本原理,有想看更詳細版本的請參考這裏

以上僅僅是回調函數的一種用途,回調函數在基於事件驅動編程以及異步編程時更是必備的,關於事件驅動編程你可以參考這裏,GUI 編程的同學對此肯定很熟悉。

希望這裏的講解對大家理解回調函數有所幫助。

也歡迎大家添加我的微信 coder_saver 圍觀朋友圈,備註寫 “圍觀” 二字即可,一起見證我們的成長。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zS7URRO5sNzobUNIqSJHIg