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