javascript
javascript之回调函数小知识
Javascript異步編程方法------“回調(diào)函數(shù)”
這是異步編程最基本的方法。
軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用。同步調(diào)用是一種阻塞式調(diào)用,調(diào)用方要等待對方執(zhí)行完畢才返回,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用模式,也就是說,被調(diào)用方在接口被調(diào)用時也會調(diào)用對方的接口;異步調(diào)用是一種類似消息或事件的機(jī)制,不過它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時,會主動通知客戶方(即調(diào)用客戶方的接口)。回調(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來實現(xiàn)異步消息的注冊,通過異步調(diào)用來實現(xiàn)消息的通知。同步調(diào)用是三者當(dāng)中最簡單的,而回調(diào)又常常是異步調(diào)用的基礎(chǔ)
首先說一下什么是個回調(diào)函數(shù)?
? ? ? 在計算機(jī)程序設(shè)計中,回調(diào)函數(shù),或簡稱回調(diào),是指通過函數(shù)參數(shù)傳遞到其它代碼的,某一塊可執(zhí)行代碼的引用。這一設(shè)計允許了底層代碼調(diào)用在高層定義的子程序。一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件。
?
回調(diào)函數(shù)實現(xiàn)的機(jī)制是
?
⑴定義一個回調(diào)函數(shù);
⑵提供函數(shù)實現(xiàn)的一方在初始化的時候,將回調(diào)函數(shù)的函數(shù)指針注冊給調(diào)用者;
⑶當(dāng)特定的事件或條件發(fā)生的時候,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對事件進(jìn)行處理。
簡單的說我們們可以像使用變量一樣使用函數(shù),作為另一個函數(shù)的參數(shù),在另一個函數(shù)中作為返回結(jié)果,在另一個函數(shù)中調(diào)用它。當(dāng)我們作為參數(shù)傳遞一個回調(diào)函數(shù)給另一個函數(shù)時,我們只傳遞了這個函數(shù)的定義,并沒有在參數(shù)中執(zhí)行它。
當(dāng)包含(調(diào)用)函數(shù)擁有了在參數(shù)中定義的回調(diào)函數(shù)后,它可以在任何時候調(diào)用(也就是回調(diào))它。
?
回調(diào)函數(shù)是閉包的
當(dāng)作為參數(shù)傳遞一個回調(diào)函數(shù)給另一個函數(shù)時,回調(diào)函數(shù)將在包含函數(shù)函數(shù)體內(nèi)的某個位置被執(zhí)行,就像回調(diào)函數(shù)在包含函數(shù)的函數(shù)體內(nèi)定義一樣。這意味著回調(diào)函數(shù)是閉包的,之后也會介紹關(guān)于閉包的一些知識。眾所周知,閉包函數(shù)可以訪問包含函數(shù)的作用域,所以,回調(diào)函數(shù)可以訪問包含函數(shù)的變量,甚至是全局變量。
?
假定有兩個函數(shù)f1和f2,后者等待前者的執(zhí)行結(jié)果。
f1();
f2();
如果f1是一個很耗時的任務(wù),可以考慮改寫f1,把f2寫成f1的回調(diào)函數(shù)。
function f1(callback){setTimeout(function () {// f1的任務(wù)代碼callback();
}, 1000);
}
執(zhí)行代碼就變成下面這樣:
f1(f2);
采用這種方式,我們把同步操作變成了異步操作,f1不會堵塞程序運行,相當(dāng)于先執(zhí)行程序的主要邏輯,將耗時的操作推遲執(zhí)行。
回調(diào)函數(shù)的優(yōu)點是簡單、容易理解和部署,缺點是不利于代碼的閱讀和維護(hù),各個部分之間高度耦合( Coupling ),流程會很混亂,而且每個任務(wù)只能指定一個回調(diào)函數(shù)。
?
有以下需求時你可以考慮使用回調(diào):
?
- 避免重復(fù)代碼?(DRY—Do Not Repeat Yourself)
- 在你需要更多的通用功能的地方更好地實現(xiàn)抽象(可處理各種類型的函數(shù))。
- 增強(qiáng)代碼的可維護(hù)性
- 增強(qiáng)代碼的可讀性
我們在JavaScript中經(jīng)常使用回調(diào)函數(shù)時注意以下幾點,尤其是現(xiàn)在的web應(yīng)用開發(fā),在第三方庫和框架中
- 異步執(zhí)行(例如讀文件,發(fā)送HTTP請求)
- 事件監(jiān)聽和處理
- 設(shè)置超時和時間間隔的方法
- 通用化:代碼簡潔?
- 有更多定制的功能
在這里我說的比較片面,有不足之處請諒解,同時也希望讀者可以多多的提意見,以便改進(jìn)
?
轉(zhuǎn)載于:https://www.cnblogs.com/jtr122624520/p/5909088.html
總結(jié)
以上是生活随笔為你收集整理的javascript之回调函数小知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] Envelop
- 下一篇: 浅谈 JavaScriptCore