




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第JavaScript中的回調(diào)函數(shù)詳細(xì)解析1.什么是回調(diào)函數(shù)(callback)呢?
把函數(shù)當(dāng)作一個(gè)參數(shù)傳到另外一個(gè)函數(shù)中,當(dāng)需要用這個(gè)函數(shù)是,再回調(diào)運(yùn)行()這個(gè)函數(shù).
回調(diào)函數(shù)是一段可執(zhí)行的代碼段,它作為一個(gè)參數(shù)傳遞給其他的代碼,其作用是在需要的時(shí)候方便調(diào)用這段(回調(diào)函數(shù))代碼。(作為參數(shù)傳遞到另外一個(gè)函數(shù)中,這個(gè)作為參數(shù)的函數(shù)就是回調(diào)函數(shù))
理解:函數(shù)可以作為一個(gè)參數(shù)傳遞到另外一個(gè)函數(shù)中。
script
functionadd(num1,num2,callback){
varsum=num1+num2;
callback(sum);
functionprint(num){
console.log(num);
add(1,2,print);//3
/script
分析:add(1,2,print);中,函數(shù)print作為一個(gè)參數(shù)傳入到add函數(shù)中,但并不是馬上起作用,而是varsum=num1+num2;運(yùn)行完之后需要打印輸出sum的時(shí)候才會(huì)調(diào)用這個(gè)函數(shù)。(這個(gè)作為參數(shù)傳遞到另外一個(gè)函數(shù)中,這個(gè)作為參數(shù)的函數(shù)就是回調(diào)函數(shù).
匿名回調(diào)函數(shù):
script
functionadd(num1,num2,callback){
varsum=num1+num2;
callback(sum);
add(1,2,function(sum){
console.log(sum);//=3
/script
2.回調(diào)函數(shù)有哪些特點(diǎn)?
1.不會(huì)立即執(zhí)行
回調(diào)函數(shù)作為參數(shù)傳遞給一個(gè)函數(shù)的時(shí)候,傳遞的只是函數(shù)的定義并不會(huì)立即執(zhí)行。和普通的函數(shù)一樣,回調(diào)函數(shù)在調(diào)用函數(shù)數(shù)中也要通過(guò)()運(yùn)算符調(diào)用才會(huì)執(zhí)行。
2.回調(diào)函數(shù)是一個(gè)閉包
回調(diào)函數(shù)是一個(gè)閉包,也就是說(shuō)它能訪問(wèn)到其外層定義的變量。
3.執(zhí)行前類型判斷
在執(zhí)行回調(diào)函數(shù)前最好確認(rèn)其是一個(gè)函數(shù)。
script
functionadd(num1,num2,callback){
varsum=num1+num2;
//判定callback接收到的數(shù)據(jù)是一個(gè)函數(shù)
if(typeofcallback===function){
//callback是一個(gè)函數(shù),才能當(dāng)回調(diào)函數(shù)使用
callback(sum);
/script
3.回調(diào)函數(shù)中this的指向問(wèn)題
注意在回調(diào)函數(shù)調(diào)用時(shí)this的執(zhí)行上下文并不是回調(diào)函數(shù)定義時(shí)的那個(gè)上下文,而是調(diào)用它的函數(shù)所在的上下文。
舉例:
script
functioncreateData(callback){
callback();
varobj={
data:100,
tool:function(){
createData(function(n){
console.log(this,1111);//window1111
obj.tool();
/script
分析:this指向是離它最近的或者嵌套級(jí)別的function/方法的調(diào)用者,這里離它最近的function是
function(n),會(huì)回到上面的callback()中,這時(shí)候調(diào)用者就不是obj而是window。
解決回調(diào)函數(shù)this指向的方法1:箭頭函數(shù)
回調(diào)函數(shù)(若回調(diào)函數(shù)是普通函數(shù)時(shí))當(dāng)參數(shù)傳入另外的函數(shù)時(shí),若不知道這個(gè)函數(shù)內(nèi)部怎么調(diào)用回調(diào)函數(shù),就會(huì)出現(xiàn)回調(diào)函數(shù)中的this指向不明確的問(wèn)題(就比如上面例子中this指向的不是obj而是window)。所以把箭頭函數(shù)當(dāng)回調(diào)函數(shù),然后作為參數(shù)傳入另外的函數(shù)中就不會(huì)出現(xiàn)this指向不明的問(wèn)題。
script
functioncreateData(callback){
callback();
varobj={
data:100,
tool:function(){
createData((n)={
this.data=n;
obj.tool();
console.log(obj.data);
/script
分析:回調(diào)函數(shù)用箭頭函數(shù)寫之后,this指向很明確,就是離它最近的或者嵌套級(jí)別的function/方法的調(diào)用者,所以這里是obj。
解決回調(diào)函數(shù)this指向的方法2:varself=this;
script
functioncreateData(callback){
callback(999);
varobj={
data:100,
tool:function(){
varself=this;//這里的this指向obj,然后當(dāng)一個(gè)變量取用
createData(function(n){
self.data=n;
obj.tool();
console.log(obj.data);
/script
4.為什么要用到回調(diào)函數(shù)?
有一個(gè)非常重要的原因JavaScript是事件驅(qū)動(dòng)的語(yǔ)言。這意味著,JavaScript不會(huì)因?yàn)橐却粋€(gè)響應(yīng)而停止當(dāng)前運(yùn)行,而是在監(jiān)聽(tīng)其他事件時(shí)繼續(xù)執(zhí)行。來(lái)看一個(gè)基本的例子:
script
functionfirst(){
console.log(1);
functionsecond(){
console.log(2);
first();
second();
/script
分析:正如你所料,first函數(shù)首先被執(zhí)行,隨后second被執(zhí)行控制臺(tái)輸出:12
但如果函數(shù)first包含某種不能立即執(zhí)行的代碼會(huì)如何呢?例如我們必須發(fā)送請(qǐng)求然后等待響應(yīng)的API請(qǐng)求?為了模擬這種狀況,我們將使用setTimeout,它是一個(gè)在一段時(shí)間之后調(diào)用函數(shù)的JavaScript函數(shù)。我們將函數(shù)延遲500毫秒來(lái)模擬一個(gè)API請(qǐng)求,新代碼長(zhǎng)這樣:
script
functionfirst(){
//模擬代碼延遲
setTimeout(function(){//所以function(){console.log(1)}是回調(diào)函數(shù)
console.log(1);
},500);
functionsecond(){
console.log(2);
first();
second();
/script
分析:這里function(){console.log(1)}函數(shù)當(dāng)作一個(gè)參數(shù)傳入setTimeout函數(shù)中,因?yàn)閟etTimeout是官方提供得一個(gè)函數(shù),里面有很多復(fù)雜的業(yè)務(wù)程序,所以函數(shù)function(){console.log(1)}傳入后,不一定馬上運(yùn)行,要setTimeout里面要運(yùn)行到function(){console.log(1)}時(shí)才會(huì)運(yùn)行該函數(shù)參數(shù),那是不是整個(gè)程序就一直等setTimeout運(yùn)行?不是的!?。?/p>
整個(gè)程序運(yùn)行結(jié)果為:21,并不是原先的12.即使我們首先調(diào)用了first()函數(shù),我們記錄的輸出結(jié)果卻在second()函數(shù)之后。
這不是JavaScript沒(méi)有按照我們想要的順序執(zhí)行函數(shù)的問(wèn)題,而是JavaScript在繼續(xù)向下執(zhí)行second()之前沒(méi)有等待first()響應(yīng)的問(wèn)題?;卣{(diào)正是確保一段代碼執(zhí)行完畢之后再執(zhí)行另一段代碼的方式。
5.回調(diào)函數(shù)和異步操作的關(guān)系是什么?回調(diào)函數(shù)是異步么?
定義:回調(diào)函數(shù)被認(rèn)為是一種高級(jí)函數(shù),一種被作為參數(shù)傳遞給另一個(gè)函數(shù)的高級(jí)函數(shù)?;卣{(diào)函數(shù)的本質(zhì)是一種模式(一種解決常見(jiàn)問(wèn)題的模式),因此回調(diào)函數(shù)也被稱為回調(diào)模式。
簡(jiǎn)而言之:一個(gè)函數(shù)在另一個(gè)函數(shù)中被調(diào)用。而且可以當(dāng)參數(shù)傳給其他函數(shù)。
所以:回調(diào)函數(shù)和異步操作的關(guān)系是沒(méi)有關(guān)系?。?!
那為什么很多的異步操作都有回填函數(shù)?。??
問(wèn):你所知道的異步操作,是回調(diào)的作用么???并不是。
回調(diào):更多的可以理解為一種業(yè)務(wù)邏輯把異步編程:JS代碼的執(zhí)行順序
簡(jiǎn)單理解:callback顧名思義打電話回來(lái)的意思
eg1:你點(diǎn)外賣,剛好你要吃的食物沒(méi)有了,于是你在店老板那里留下了你的電話,過(guò)了幾天店里有了,店員就打了你的電話,然后你接到電話后就跑到店里買了。在這個(gè)例子里,你的電話號(hào)碼就叫回調(diào)函數(shù),你
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 以人為本提升醫(yī)護(hù)團(tuán)隊(duì)工作效率與質(zhì)量的研究報(bào)告
- 醫(yī)療AI的隱私保護(hù)與法規(guī)要求
- 醫(yī)療健康管理中的個(gè)性化服務(wù)設(shè)計(jì)與實(shí)施
- AI臨床決策支持系統(tǒng)的科技發(fā)展及其挑戰(zhàn)
- 人性化醫(yī)療服務(wù)的國(guó)際比較與借鑒
- 企業(yè)內(nèi)部健康管理探索員工對(duì)新型醫(yī)療科技的接受度
- 學(xué)校體育教師的工作總結(jié)模版
- 看開(kāi)學(xué)第一課心得體會(huì)模版
- 醫(yī)療AI在公共衛(wèi)生領(lǐng)域的倫理應(yīng)用探討
- 業(yè)務(wù)撮合合同范例
- AI工業(yè)質(zhì)檢簡(jiǎn)介演示
- 《鈦合金鍛造講》課件
- 2023年11月四川鐵道職業(yè)學(xué)院編制外工作人員招聘筆試歷年高頻考點(diǎn)-難、易錯(cuò)點(diǎn)薈萃附答案帶詳解
- 2023年10月自考試題04737C++程序設(shè)計(jì)
- 九年級(jí)化學(xué)(第八單元 金屬和金屬材料)8.1 金屬材料(人教版 學(xué)習(xí)、上課課件)
- 耐高溫材料研究
- 2024年城市更新與歷史文化保護(hù)
- 船舶在波浪中的運(yùn)動(dòng)理論-ch2-海洋波浪理論1講課件
- DZ銅萃取性能及應(yīng)用
- 空調(diào)移機(jī)安裝合同協(xié)議書范本
- 高中語(yǔ)文說(shuō)課評(píng)價(jià)表
評(píng)論
0/150
提交評(píng)論