回調(diào)函數(shù)

回調(diào)函數(shù)

wiki

在計算機(jī)編程中,一個回調(diào)是對一段可執(zhí)行代碼的引用一姿,該代碼作為參數(shù)傳遞給其他代碼。

jQuery文檔

回調(diào)是一個函數(shù),它作為參數(shù)傳遞給另一個函數(shù)遥诉,并在父函數(shù)完成后執(zhí)行苞笨。
回調(diào)的特別之處在于宪塔,在“父”節(jié)點(diǎn)之后出現(xiàn)的函數(shù)可以在回調(diào)執(zhí)行之前執(zhí)行戚长。
另一個需要知道的重要事情是如何正確地傳遞回調(diào)盗冷。這就是我經(jīng)常忘記正確語法的地方。

百科

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)同廉。
如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù)仪糖,當(dāng)這個指針被用為調(diào)用它所指向的函數(shù)時柑司,我們就說這是回調(diào)函數(shù)。
回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用锅劝,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的攒驰,用于對該事件或條件進(jìn)行響應(yīng)。

因此故爵,回調(diào)本質(zhì)上是一種設(shè)計模式玻粪,并且jQuery(包括其他框架)的設(shè)計原則遵循了這個模式。

在JavaScript中诬垂,回調(diào)函數(shù)具體的定義為:函數(shù)A作為參數(shù)(函數(shù)引用)傳遞到另一個函數(shù)B中劲室,并且這個函數(shù)B執(zhí)行函數(shù)A。我們就說函數(shù)A叫做回調(diào)函數(shù)结窘。如果沒有名稱(函數(shù)表達(dá)式)很洋,就叫做匿名回調(diào)函數(shù)。

因此callback 不一定用于異步隧枫,一般同步(阻塞)的場景下也經(jīng)常用到回調(diào)喉磁,比如要求執(zhí)行某些操作后執(zhí)行回調(diào)函數(shù)。

例子
一個同步(阻塞)中使用回調(diào)的例子官脓,目的是在func1代碼執(zhí)行完成后執(zhí)行func2线定。

var func1=function(callback){
    //do something.
    (callback && typeof(callback) === "function") && callback();
}
func1(func2);
    var func2=function(){
}

異步回調(diào)的例子:

$(document).ready(callback);

$.ajax({
  url: "test.html",
  context: document.body
}).done(function() { 
  $(this).addClass("done");
}).fail(function() { alert("error");
}).always(function() { alert("complete"); 
});
/**
注意的是,ajax請求確實(shí)是異步的,不過這請求是由瀏覽器新開一個線程請求,當(dāng)請求的狀態(tài)變更時,如果先前已設(shè)置回調(diào),這異步線程就產(chǎn)生狀態(tài)變更事件放到 JavaScript引擎的處理隊(duì)列中等待處理确买。見:http://www.phpv.net/html/1700.html
*/

回調(diào)什么時候執(zhí)行
回調(diào)函數(shù)斤讥,一般在同步情境下是最后執(zhí)行的,而在異步情境下有可能不執(zhí)行湾趾,因?yàn)槭录]有被觸發(fā)或者條件不滿足芭商。

回調(diào)函數(shù)的使用場合

  • 資源加載:動態(tài)加載js文件后執(zhí)行回調(diào),加載iframe后執(zhí)行回調(diào)搀缠,ajax操作回調(diào)铛楣,圖片加載完成執(zhí)行回調(diào),AJAX等等艺普。
  • DOM事件及Node.js事件基于回調(diào)機(jī)制(Node.js回調(diào)可能會出現(xiàn)多層回調(diào)嵌套的問題)簸州。
  • setTimeout的延遲時間為0,這個hack經(jīng)常被用到歧譬,settimeout調(diào)用的函數(shù)其實(shí)就是一個callback的體現(xiàn)
  • 鏈?zhǔn)秸{(diào)用:鏈?zhǔn)秸{(diào)用的時候岸浑,在賦值器(setter)方法中(或者本身沒有返回值的方法中)很容易實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,而取值器(getter)相對來說不好實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用瑰步,因?yàn)槟阈枰≈灯鞣祷啬阈枰臄?shù)據(jù)而不是this指針矢洲,如果要實(shí)現(xiàn)鏈?zhǔn)椒椒ǎ梢杂没卣{(diào)函數(shù)來實(shí)現(xiàn)
  • setTimeout缩焦、setInterval的函數(shù)調(diào)用得到其返回值读虏。由于兩個函數(shù)都是異步的责静,即:他們的調(diào)用時序和程序的主流程是相對獨(dú)立的,所以沒有辦法在主體里面等待它們的返回值盖桥,它們被打開的時候程序也不會停下來等待灾螃,否則也就失去了setTimeout及setInterval的意義了,所以用return已經(jīng)沒有意義揩徊,只能使用callback睦焕。callback的意義在于將timer執(zhí)行的結(jié)果通知給代理函數(shù)進(jìn)行及時處理。

回調(diào)函數(shù)的傳遞
上面說了靴拱,要將函數(shù)引用或者函數(shù)表達(dá)式作為參數(shù)傳遞垃喊。

$.get('myhtmlpage.html', myCallBack);//這是對的
$.get('myhtmlpage.html', myCallBack('foo', 'bar'));//這是錯的,那么要帶參數(shù)呢袜炕?
$.get('myhtmlpage.html', function(){//帶參數(shù)的使用函數(shù)表達(dá)式
myCallBack('foo', 'bar');
});

另外本谜,最好保證回調(diào)存在且必須是函數(shù)引用或者函數(shù)表達(dá)式:
(callback && typeof(callback) === "function") && callback();

通俗易懂的例子

你有事去隔壁寢室找同學(xué),發(fā)現(xiàn)人不在偎窘,你怎么辦呢乌助?
方法1,每隔幾分鐘再去趟隔壁寢室陌知,看人在不
方法2他托,拜托與他同寢室的人,看到他回來時叫一下你

前者是輪詢仆葡,后者是回調(diào)赏参。

那你說,我直接在隔壁寢室等到同學(xué)回來可以嗎沿盅?

可以啊把篓,只不過這樣原本你可以省下時間做其他事,現(xiàn)在必須浪費(fèi)在等待上了腰涧。把原來的非阻塞的異步調(diào)用變成了阻塞的同步調(diào)用韧掩。

JavaScript的回調(diào)是在異步調(diào)用場景下使用的,使用回調(diào)性能好于輪詢窖铡。

來源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疗锐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子费彼,更是在濱河造成了極大的恐慌滑臊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敌买,死亡現(xiàn)場離奇詭異简珠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虹钮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門聋庵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芙粱,你說我怎么就攤上這事祭玉。” “怎么了春畔?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵脱货,是天一觀的道長。 經(jīng)常有香客問我律姨,道長振峻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任择份,我火速辦了婚禮扣孟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荣赶。我一直安慰自己凤价,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布拔创。 她就那樣靜靜地躺著利诺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剩燥。 梳的紋絲不亂的頭發(fā)上慢逾,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音灭红,去河邊找鬼氛改。 笑死,一個胖子當(dāng)著我的面吹牛比伏,可吹牛的內(nèi)容都是我干的胜卤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赁项,長吁一口氣:“原來是場噩夢啊……” “哼葛躏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悠菜,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舰攒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悔醋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摩窃,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猾愿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹦聪。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒂秘,靈堂內(nèi)的尸體忽然破棺而出泽本,到底是詐尸還是另有隱情,我是刑警寧澤姻僧,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布规丽,位于F島的核電站,受9級特大地震影響撇贺,放射性物質(zhì)發(fā)生泄漏赌莺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一松嘶、第九天 我趴在偏房一處隱蔽的房頂上張望艘狭。 院中可真熱鬧,春花似錦喘蟆、人聲如沸缓升。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽港谊。三九已至,卻和暖如春橙弱,著一層夾襖步出監(jiān)牢的瞬間歧寺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工棘脐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斜筐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓蛀缝,卻偏偏與公主長得像顷链,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屈梁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)嗤练。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用為調(diào)用...
    小沙鷹168閱讀 506評論 0 1
  • C語言是面向過程的在讶,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個結(jié)構(gòu)化語言煞抬,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程...
    小辰帶你看世界閱讀 1,340評論 0 9
  • 回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)构哺。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù)革答,當(dāng)這個指針被用為調(diào)用它...
    Bookish倩寶閱讀 662評論 0 0
  • 大家好,我是IT修真院成都分院第09期學(xué)員。今天分享的內(nèi)容是js中回調(diào)函數(shù)残拐? 1.背景介紹 在我們接觸ajax途茫,與...
    我要夏天_11ec閱讀 415評論 0 2
  • 那個時候只單純的喜歡他眠菇,不因?yàn)槭裁矗灰驗(yàn)樗撬ぶ裕灰纳碛俺霈F(xiàn)在我的視線捎废,我的目光就會隨他而去。大概這樣的喜歡...
    薇玥閱讀 332評論 0 0