回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí)情龄,我們就說(shuō)這是回調(diào)函數(shù)民泵⊙⑸ィ回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的栈妆,用于對(duì)該事件或條件進(jìn)行響應(yīng)胁编。
回調(diào)函數(shù),一般在同步情境下是最后執(zhí)行的鳞尔,而在異步情境下有可能不執(zhí)行嬉橙,因?yàn)槭录](méi)有被觸發(fā)或者條件不滿(mǎn)足。
資源加載:動(dòng)態(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)可能會(huì)出現(xiàn)多層回調(diào)嵌套的問(wèn)題)。
setTimeout的延遲時(shí)間為0兔沃,這個(gè)hack經(jīng)常被用到蒋得,settimeout調(diào)用的函數(shù)其實(shí)就是一個(gè)callback的體現(xiàn)
鏈?zhǔn)秸{(diào)用:鏈?zhǔn)秸{(diào)用的時(shí)候,在賦值器(setter)方法中(或者本身沒(méi)有返回值的方法中)很容易實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用乒疏,而取值器(getter)相對(duì)來(lái)說(shuō)不好實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用额衙,因?yàn)槟阈枰≈灯鞣祷啬阈枰臄?shù)據(jù)而不是this指針,如果要實(shí)現(xiàn)鏈?zhǔn)椒椒ǎ梢杂没卣{(diào)函數(shù)來(lái)實(shí)現(xiàn)setTimeout窍侧、setInterval的函數(shù)調(diào)用得到其返回值县踢。由于兩個(gè)函數(shù)都是異步的,即:他們的調(diào)用時(shí)序和程序的主流程是相對(duì)獨(dú)立的伟件,所以沒(méi)有辦法在主體里面等待它們的返回值硼啤,它們被打開(kāi)的時(shí)候程序也不會(huì)停下來(lái)等待,否則也就失去了setTimeout及setInterval的意義了斧账,所以用return已經(jīng)沒(méi)有意義谴返,只能使用callback。callback的意義在于將timer執(zhí)行的結(jié)果通知給代理函數(shù)進(jìn)行及時(shí)處理咧织。