摘要:回調(diào)定義剛開始學(xué)習(xí)時,對回調(diào)函數(shù)的理解僅僅停留在知道定義階段。什么是回調(diào)函數(shù)就是將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),作為參數(shù)的這個函數(shù)就是回調(diào)函數(shù)。參考文章詳解回調(diào)函數(shù)以為例解讀異步回調(diào)和異步編程的種方法阮一峰的網(wǎng)絡(luò)日志
回調(diào)定義
剛開始學(xué)習(xí)javascript時,對回調(diào)函數(shù)的理解僅僅停留在知道定義階段。什么是回調(diào)函數(shù)? 就是將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),作為參數(shù)的這個函數(shù)就是回調(diào)函數(shù)。 至于為什么要用到回調(diào)函數(shù)?回調(diào)函數(shù)有什么作用? 當(dāng)時對這些一無所知! 最近學(xué)習(xí)node.js涉及到了大量的異步編程,很多地方都需要用到回調(diào)函數(shù),所以這兩天深入了解了JavaScript的回調(diào)函數(shù),下面是我對回調(diào)函數(shù)的理解。
函數(shù)也是對象想要弄明白js回調(diào)函數(shù),首先要清楚函數(shù)的規(guī)則,在javascript中函數(shù)是一個對象,準(zhǔn)確的來說函數(shù)是用function()構(gòu)造函數(shù)創(chuàng)建的一個function對象,因此我們可以將函數(shù)存儲在變量中,當(dāng)然也就可以將存儲在變量中的函數(shù)作為一個參數(shù)傳遞給另一個函數(shù),這就是回調(diào)函數(shù)。
舉個例子:
var callback = function(arg3) { console.log("callback Totle is:" + arg3) } function fn(arg1, arg2, cb) { var Total = arg1 + arg2; cb(Total); console.log("mainFunction Totle is:" + Total) } fn(2, 2, callback) // 調(diào)用fn()函數(shù),并傳入2, 2, callback作為參數(shù)
上面例子中我們將一個匿名函數(shù)賦值給變量callback,同時將callback作為參數(shù)傳遞給了fn()函數(shù),這時在函數(shù)fn()中callback就是回調(diào)函數(shù)。
同步回調(diào)和異步回調(diào)上面的代碼執(zhí)行結(jié)果為:
callback Totle is:4 mainFunction Totle is:4
不對啊! 回調(diào)函數(shù)不是應(yīng)該在主函數(shù)的最后執(zhí)行嗎?
對,很多介紹回調(diào)函數(shù)的例子講到這里是就完了,異步回調(diào)函數(shù)的確是應(yīng)該在函數(shù)的最后執(zhí)行,不過上面的例子是一個同步回調(diào)函數(shù),函數(shù)的執(zhí)行順序依然自上而下順序執(zhí)行。 那么什么是異步回調(diào)呢? 我們又怎么實(shí)現(xiàn)異步回調(diào)呢? 下面我們舉兩個例子來說明:
示例1:
function f2() { console.log("f2 finished") } function f1(cb) { setTimeout(cb,1000) //用setTimeout()模擬耗時操作 console.log("f1 finished") } f1(f2); //得到的結(jié)果是 f1 finished ,f2 finished
這里我們用setTimeout()來模擬耗時操作的前提是js中的setTimeout()函數(shù)支持異步處理,所以我們得到的結(jié)果是 f1 finished ,f2 finished
示例2:
var fs = require("fs"); fs.readFile("input.txt","utf-8", function (err, data) { if (err) return console.error(err); console.log(data.toString()); }); console.log("程序執(zhí)行結(jié)束!");
程序執(zhí)行的結(jié)果是:
$ node app 程序執(zhí)行結(jié)束! 我們來測試一下異步回調(diào)函數(shù)
上面例子中我們先創(chuàng)建了一個文件input.txt,里面的內(nèi)容是:"我們來測試一下異步回調(diào)函數(shù)"
如果按照同步的思維,程序應(yīng)該執(zhí)行fs.readFile,直到文件讀完之后才執(zhí)行后面的console.log("程序執(zhí)行結(jié)束!"); 然而node中的fs.readFile是支持異步處理的,因此程序執(zhí)行到這兒的時候并不會阻塞,而是繼續(xù)向后執(zhí)行,當(dāng)文件讀取完畢之后再自動調(diào)用傳入的匿名回調(diào)函數(shù),因此出現(xiàn)了上面的結(jié)果。
參考文章:
詳解回調(diào)函數(shù)——以JS為例解讀異步、回調(diào)和EventLoop http://blog.csdn.net/tywinsta...
Javascript異步編程的4種方法 - 阮一峰的網(wǎng)絡(luò)日志http://www.ruanyifeng.com/blo...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/82961.html
摘要:同步與異步以上為同步代碼,函數(shù)必須等函數(shù)執(zhí)行完畢后才能執(zhí)行。異步回調(diào)產(chǎn)生的結(jié)果就是,函數(shù)的調(diào)用并不直接返回結(jié)果,而往往是交給回調(diào)函數(shù)進(jìn)行異步處理。 同步與異步: function a(){} function b(){} a(); b(); 以上為同步代碼,函數(shù)b必須等函數(shù)a執(zhí)行完畢后才能執(zhí)行。 function a(){ ...
摘要:回調(diào)大多出現(xiàn)在請求,用于處理收到的請求結(jié)果。回調(diào)函數(shù)和異步一開始我被回調(diào)和異步有點(diǎn)搞暈了。異步編程的實(shí)現(xiàn)就我目前知道兩種回調(diào)函數(shù)和事件監(jiān)聽,其實(shí)看了阮神的異步編程的文章和下面的評論之后得出的理解。為了不影響的執(zhí)行,我們可以把寫成的回調(diào)函數(shù)。 前言 一個剛?cè)肭岸说男〔耍m然以前看到過關(guān)于回調(diào)的文章,但是呢,理解起來有點(diǎn)費(fèi)勁啊。當(dāng)時的腦海里就一個概念。 回調(diào):大多出現(xiàn)在Ajax請求,用于處...
摘要:圖片轉(zhuǎn)引自的演講和兩個定時器中回調(diào)的執(zhí)行邏輯便是典型的機(jī)制。異步編程關(guān)于異步編程我的理解是,在執(zhí)行環(huán)境所提供的異步機(jī)制之上,在應(yīng)用編碼層面上實(shí)現(xiàn)整體流程控制的異步風(fēng)格。 問題背景 在一次開發(fā)任務(wù)中,需要實(shí)現(xiàn)如下一個餅狀圖動畫,基于canvas進(jìn)行繪圖,但由于對于JS運(yùn)行環(huán)境中異步機(jī)制的不了解,所以遇到了一個棘手的問題,始終無法解決,之后在與同事交流之后才恍然大悟。問題的根節(jié)在于經(jīng)典的J...
摘要:而異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用。總結(jié)回調(diào)函數(shù)是異步編程中的基石,但同時也存在很多問題,不太適合人類自然語言的線性思維習(xí)慣。 為什么 JS 是單線程? 眾所周知,Javascript 語言的執(zhí)行環(huán)境是單線程(single thread)。 所謂單線程,就是指一次只能完成一...
學(xué)習(xí)一門知識,有些內(nèi)容必須要提前明白,比如在學(xué)習(xí)js中同步異步的問題前,需要明白,js是單線程的,為什么它得是單線程的呢?現(xiàn)在先從它應(yīng)用的場景來說,就是用來讓用戶與頁面進(jìn)行交互的吧。假如有js是多線程的,那在這個線程里面,用戶點(diǎn)擊某個按鈕會增加一個DOM節(jié)點(diǎn),在另一個線程里面,用戶點(diǎn)擊這個按鈕又會刪除一個DOM節(jié)點(diǎn),那么此時js就不知道該聽誰的了。這就是為什么會出現(xiàn)同步異步。假設(shè)沒有異步,那么...
閱讀 2491·2021-10-19 11:45
閱讀 2477·2021-09-30 09:56
閱讀 1441·2021-09-30 09:47
閱讀 597·2019-08-30 15:53
閱讀 1840·2019-08-30 15:44
閱讀 587·2019-08-30 12:52
閱讀 1089·2019-08-30 11:16
閱讀 1613·2019-08-29 16:36