
文章插圖
回調(diào)函數(shù)是每個前端程序員都應(yīng)該知道的概念之一 ?;卣{(diào)可用于數(shù)組、計(jì)時器函數(shù)、promise、事件處理中 。
本文將會解釋回調(diào)函數(shù)的概念,同時幫你區(qū)分兩種回調(diào):同步和異步 。
回調(diào)函數(shù)首先寫一個向人打招呼的函數(shù) 。
只需要創(chuàng)建一個接受 name參數(shù)的函數(shù) greet(name) 。這個函數(shù)應(yīng)返回打招呼的消息:
如果向很多人打招呼該怎么辦?可以用特殊的數(shù)組方法 array.map()可以實(shí)現(xiàn):
persons.map(greet)獲取 persons數(shù)組的所有元素,并分別用每個元素作為調(diào)用參數(shù)來調(diào)用 greet()
函數(shù):`greet(‘Cristina’), greet(‘Ana’) 。
有意思的是 persons.map(greet)方法可以接受 greet()函數(shù)作為參數(shù) 。這樣 greet()就成了回調(diào)函數(shù) 。
persons.map(greet)是用另一個函數(shù)作為參數(shù)的函數(shù),因此被稱為高階函數(shù) 。
回調(diào)函數(shù)作為高階函數(shù)的參數(shù),高階函數(shù)通過調(diào)用回調(diào)函數(shù)來執(zhí)行操作 。
重要的是高階函數(shù)負(fù)責(zé)調(diào)用回調(diào),并為其提供正確的參數(shù) 。
在前面的例子中,高階函數(shù) persons.map(greet)負(fù)責(zé)調(diào)用 greet()函數(shù),并分別把數(shù)組中所有的元素 ‘Cristina’和 Ana ‘作為參數(shù) 。
這就為識別回調(diào)提供了一條簡單的規(guī)則 。如果你定義了一個函數(shù),并將其作參數(shù)提供給另一個函數(shù)的話,那么這就創(chuàng)建了一個回調(diào) 。
你可以自己編寫使用回調(diào)的高階函數(shù) 。下面是 array.map()方法的等效版本:
map(array,callback)是一個高階函數(shù),因?yàn)樗没卣{(diào)函數(shù)作為參數(shù),然后在其主體內(nèi)部調(diào)用該回調(diào)函數(shù):callback(item) 。
注意,常規(guī)函數(shù)(用關(guān)鍵字 function定義)或箭頭函數(shù)(用粗箭頭 =>定義)同樣可以作為回調(diào)使用 。
同步回調(diào)回調(diào)的調(diào)用方式有兩種:同步和異步回調(diào) 。
同步回調(diào)是“阻塞”的:高階函數(shù)直到回調(diào)函數(shù)完成后才繼續(xù)執(zhí)行 。
例如,調(diào)用 map()和 greet()函數(shù) 。
其中 greet()是同步回調(diào) 。
同步回調(diào)的步驟:
高階函數(shù)開始執(zhí)行:’map() starts’回調(diào)函數(shù)執(zhí)行:’greet() called’最后高階函數(shù)完成它自己的執(zhí)行過程:’map() completed’同步回調(diào)的例子許多原生 JavaScript 類型的方法都使用同步回調(diào) 。
最常用的是 array 的方法,例如:
array.map(callback), array.forEach(callback), array.find(callback), array.filter(callback),
array.reduce(callback,init)
字符串類型的 string.replace(callback)方法也能接受同步執(zhí)行的回調(diào):
異步回調(diào)異步回調(diào)是“非阻塞的”:高階函數(shù)無需等待回調(diào)完成即可完成其執(zhí)行 。高階函數(shù)可確保稍后在特定事件上執(zhí)行回調(diào) 。
在以下的例子中,later()函數(shù)的執(zhí)行延遲了 2 秒:
later()是一個異步回調(diào),因?yàn)?setTimeout(later,2000)啟動并完成了執(zhí)行,但是 later()在 2 秒后執(zhí)行 。
異步調(diào)用回調(diào)的步驟:
高階函數(shù)開始執(zhí)行:’setTimeout()starts’高階函數(shù)完成其執(zhí)行: ‘setTimeout() completed’回調(diào)函數(shù)在 2 秒鐘后執(zhí)行: ‘later() called’異步回調(diào)的例子計(jì)時器函數(shù)異步調(diào)用回調(diào):
DOM 事件偵聽器還異步調(diào)用事件處理函數(shù)(回調(diào)函數(shù)的子類型):
4.異步回調(diào)函數(shù)與異步函數(shù)在函數(shù)定義之前加上特殊關(guān)鍵字 async會創(chuàng)建一個異步函數(shù):
fetchUserNames()是異步的,因?yàn)樗?async為前綴 。函數(shù)
await fetch(‘https://api.github.com/users?per_page=5′)從 GitHub 上獲取前5個用戶。然后從響應(yīng)對象中提取 JSON 數(shù)據(jù):awaitresp.json() 。
異步函數(shù)是 promise 之上的語法糖 。當(dāng)遇到表達(dá)式 await<promise>(調(diào)用 fetch()會返回一個promise)時,異步函數(shù)會暫停執(zhí)行,直到 promise 被解決 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 洗空調(diào)怎么洗 空調(diào)的清洗方法
- 小龍蝦調(diào)料一次放一袋嗎 小龍蝦調(diào)料一次放多少
- 查詢他人通話記錄的方法 怎么調(diào)取老公的通話記錄
- 空調(diào)安裝好了怎么試機(jī)?
- word表格轉(zhuǎn)換成excel表格的步驟 excel表格導(dǎo)入word太大怎么調(diào)整
- Word表格跨頁怎么調(diào)整 word表格跨頁怎么調(diào)整成一頁
- 空調(diào)安裝沒有預(yù)留電源怎么辦?
- 慢運(yùn)動可調(diào)節(jié)身心平衡 打太極健身緩壓
- 手機(jī)沒有紅外線怎么遙控空調(diào) 哪些手機(jī)有紅外功能
- oracle遞歸查詢函數(shù) oracle遞歸查詢語句
