92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

JS中的 回調函數(callback)

2023-2-1    前端達人

目錄

1.什么是回調函數(callback)呢?

2.回調函數有哪些特點?

3.回調函數中this的指向問題

4.為什么要用到回調函數?

5.回調函數和異步操作的關系是什么?回調函數是異步么?


1.什么是回調函數(callback)呢?

把函數當作一個參數傳到另外一個函數中,當需要用這個函數是,再回調運行()這個函數.

回調函數是一段可執行的代碼段,它作為一個參數傳遞給其他的代碼,其作用是在需要的時候方便調用這段(回調函數)代碼。(作為參數傳遞到另外一個函數中,這個作為參數的函數就是回調函數)

理解:函數可以作為一個參數傳遞到另外一個函數中。


  1. <script>
  2. function add(num1, num2, callback) {
  3. var sum = num1 + num2;
  4. callback(sum);
  5. }
  6. function print(num) {
  7. console.log(num);
  8. }
  9. add(1, 2, print); //3
  10. </script>

分析:add(1, 2, print);中,函數print作為一個參數傳入到add函數中,但并不是馬上起作用,而是var sum = num1 + num2;運行完之后需要打印輸出sum的時候才會調用這個函數。(這個作為參數傳遞到另外一個函數中,這個作為參數的函數就是回調函數.

匿名回調函數:


  1. <script>
  2. function add(num1, num2, callback) {
  3. var sum = num1 + num2;
  4. callback(sum);
  5. }
  6. add(1, 2, function (sum) {
  7. console.log(sum); //=>3
  8. });
  9. </script>

2.回調函數有哪些特點?

1.不會立即執行

回調函數作為參數傳遞給一個函數的時候,傳遞的只是函數的定義并不會立即執行。和普通的函數一樣,回調函數在調用函數數中也要通過()運算符調用才會執行。

2.回調函數是一個閉包

回調函數是一個閉包,也就是說它能訪問到其外層定義的變量。

3.執行前類型判斷

在執行回調函數前最好確認其是一個函數。


  1. <script>
  2. function add(num1, num2, callback) {
  3. var sum = num1 + num2;
  4. //判定callback接收到的數據是一個函數
  5. if (typeof callback === 'function') {
  6. //callback是一個函數,才能當回調函數使用
  7. callback(sum);
  8. }
  9. }
  10. </script>

3.回調函數中this的指向問題

注意在回調函數調用時this的執行上下文并不是回調函數定義時的那個上下文,而是調用它的函數所在的上下文。

舉例:


  1. <script>
  2. function createData(callback){
  3. callback();
  4. }
  5. var obj ={
  6. data:100,
  7. tool:function(){
  8. createData(function(n){
  9. console.log(this,1111); //window 1111
  10. })
  11. }
  12. }
  13. obj.tool();
  14. </script>

分析:this指向是 離它最近的或者嵌套級別的 function/方法的調用者,這里離它最近的function是

function(n),會回到上面的callback()中,這時候調用者就不是obj而是window。

 解決回調函數this指向的方法1:箭頭函數

回調函數(若回調函數是普通函數時)當參數傳入另外的函數時,若不知道這個函數內部怎么調用回調函數,就會出現回調函數中的this指向不明確的問題(就比如上面例子中this指向的不是obj而是window)。所以 把箭頭函數當回調函數,然后作為參數傳入另外的函數中就不會出現this指向不明的問題


  1. <script>
  2. function createData(callback){
  3. callback();
  4. }
  5. var obj ={
  6. data:100,
  7. tool:function(){
  8. createData((n)=>{
  9. this.data = n;
  10. })
  11. }
  12. }
  13. obj.tool();
  14. console.log(obj.data);
  15. </script>

 分析:回調函數用箭頭函數寫之后,this指向很明確,就是 離它最近的或者嵌套級別的 function/方法的調用者,所以這里是 obj 。

解決回調函數this指向的方法2:var self = this;


  1. <script>
  2. function createData(callback){
  3. callback(999);
  4. }
  5. var obj ={
  6. data:100,
  7. tool:function(){
  8. var self = this; //這里的this指向obj,然后當一個變量取用
  9. createData(function(n){
  10. self.data = n;
  11. })
  12. }
  13. }
  14. obj.tool();
  15. console.log(obj.data);
  16. </script>

4.為什么要用到回調函數?

有一個非常重要的原因 —— JavaScript 是事件驅動的語言。這意味著,JavaScript 不會因為要等待一個響應而停止當前運行,而是在監聽其他事件時繼續執行。來看一個基本的例子:


  1. <script>
  2. function first() {
  3. console.log(1);
  4. }
  5. function second() {
  6. console.log(2);
  7. }
  8. first();
  9. second();
  10. </script>

 分析:正如你所料,first 函數首先被執行,隨后 second 被執行 —— 控制臺輸出:1  2

但如果函數 first 包含某種不能立即執行的代碼會如何呢?例如我們必須發送請求然后等待響應的 API 請求?為了模擬這種狀況,我們將使用 setTimeout,它是一個在一段時間之后調用函數的 JavaScript 函數。我們將函數延遲 500 毫秒來模擬一個 API 請求,新代碼長這樣:


  1. <script>
  2. function first() {
  3. // 模擬代碼延遲
  4. setTimeout(function () { //所以function(){console.log(1)}是回調函數
  5. console.log(1);
  6. }, 500);
  7. }
  8. function second() {
  9. console.log(2);
  10. }
  11. first();
  12. second();
  13. </script>

分析:這里 function(){console.log(1)}函數當作一個參數傳入setTimeout函數中,因為setTimeout是官方提供得一個函數,里面有很多復雜的業務程序,所以函數 function(){console.log(1)}傳入后,不一定馬上運行,要setTimeout里面要運行到function(){console.log(1)}時才會運行該函數參數,那是不是整個程序就一直等setTimeout運行?不是的?。?!

整個程序運行結果為: 2  1 ,并不是原先的1 2 .即使我們首先調用了 first() 函數,我們記錄的輸出結果卻在 second() 函數之后。

這不是 JavaScript 沒有按照我們想要的順序執行函數的問題,而是 JavaScript 在繼續向下執行 second() 之前沒有等待 first() 響應的問題。回調正是確保一段代碼執行完畢之后再執行另一段代碼的方式。

5.回調函數和異步操作的關系是什么?回調函數是異步么?

定義:回調函數被認為是一種高級函數,一種被作為參數傳遞給另一個函數的高級函數。回調函數的本質是一種模式(一種解決常見問題的模式),因此回調函數也被稱為回調模式。 

簡而言之:一個函數在另一個函數中被調用。而且可以當參數傳給其他函數。

所以: 回調函數和異步操作的關系是沒有關系?。?! 

那為什么很多的異步操作都有回填函數????

問:你所知道的異步操作,是回調的作用么???  并不是。

回調:更多的可以理解為一種業務邏輯把           異步編程:JS代碼的執行順序       

簡單理解:callback 顧名思義  打電話回來的意思

eg1:你點外賣,剛好你要吃的食物沒有了,于是你在店老板那里留下了你的電話,過了幾天店里有了,店員就打了你的電話,然后你接到電話后就跑到店里買了。在這個例子里,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店里后來有貨了叫做觸發了回調關聯的事件,店員給你打電話叫做調用回調函數,你到店里去取貨叫做響應回調事件。

eg2:再比如,你發送一個axios 請求,請求成功之后,觸發成功的回調函數,請求失敗觸發失敗的回調函數。這里面的回調函數更像是一個工具,后臺通過這個工具告訴你,你成功了抑或是失敗了。這里面的所有異步操作都和回調沒關系,真正的異步是then方法。




藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

日歷

鏈接

個人資料

藍藍設計的小編 http://www.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
欧美成人免费网| 欧美极品少妇与黑人| 国产一区视频在线播放| 日本久久久a级免费| 久久韩国免费视频| 欧美黑人极品猛少妇色xxxxx| 国产福利精品av综合导导航| 57pao国产精品一区| 中文字幕日韩av| 久久久成人av| 国产最新精品视频| 午夜精品一区二区三区视频免费看| 欧美成人激情视频免费观看| 国产在线精品播放| 成人在线精品视频| 国产精品美女无圣光视频| 97热在线精品视频在线观看| 亚洲精品中文字幕有码专区| 亚洲成人精品久久久| 久久亚洲春色中文字幕| 在线视频亚洲欧美| 久久久精品在线| 九九热精品视频在线播放| 欧美裸体xxxx极品少妇软件| 欧美色视频日本高清在线观看| 国产精品视频不卡| 亚洲区一区二区| 精品国产欧美成人夜夜嗨| 91超碰caoporn97人人| 日韩精品视频在线播放| 欧美大片免费观看| 午夜精品久久久久久久99黑人| 久久免费高清视频| 欧美日韩黄色大片| 国产精品美女免费看| 日本高清不卡的在线| 91美女片黄在线观看游戏| 日韩国产欧美精品一区二区三区| 日韩精品亚洲视频| 欧美电影免费观看大全| 日韩av观看网址| 国产美女久久久| 久久这里只有精品视频首页| 色偷偷偷亚洲综合网另类| 国产精品久久一| 久久久久久久影视| 日韩在线精品一区| 国产成人精品久久亚洲高清不卡| 91极品女神在线| 亚洲精品日韩久久久| 欧美精品成人在线| 最近2019中文字幕在线高清| 久久久免费在线观看| 日韩在线国产精品| 91在线精品视频| 午夜精品一区二区三区在线播放| 懂色av一区二区三区| 亚洲国产小视频| 日韩在线中文字幕| 国产精品日韩欧美大师| 欧美成人精品在线观看| 中文字幕欧美日韩| 亚洲高清福利视频| 欧美精品激情在线观看| 在线视频欧美日韩精品| 日韩av综合网站| 韩国19禁主播vip福利视频| 国产精品久久久久7777婷婷| 国产亚洲精品一区二555| 亚洲无限乱码一二三四麻| 国产成人精品久久二区二区| 中文字幕在线观看亚洲| 欧美黑人视频一区| 久久久久www| 91精品视频专区| 国产99久久精品一区二区 夜夜躁日日躁| 福利视频第一区| 欧美日韩福利电影| 欧美一级视频一区二区| 国产一区二区三区在线观看网站| 色婷婷成人综合| 91久久久久久国产精品| 中文日韩电影网站| 国产欧美婷婷中文| 美女999久久久精品视频| 国产精品视频一区二区高潮| 亚洲一区二区三区毛片| 欧美电影院免费观看| 日韩av色在线| 亚洲日韩中文字幕在线播放| 国产精品三级在线| 亚洲人成在线免费观看| 欧美成人黑人xx视频免费观看| 精品国产精品三级精品av网址| 欧美在线观看日本一区| 久久99久久99精品免观看粉嫩| 国产精品视频色| 欧美日韩视频免费播放| 69av成年福利视频| 久久久91精品国产| 亚洲午夜av久久乱码| 久久久精品国产一区二区| 成人激情视频在线| 亚洲高清一区二| 国产精品久久久久av| 国产专区精品视频| 国产亚洲精品久久久优势| 欧美成人性色生活仑片| 亚洲国产中文字幕久久网| 亚洲国产精品va在线看黑人| 国产啪精品视频网站| 国产精品香蕉av| 日韩精品免费观看| 精品国产一区二区三区久久狼5月| 精品久久久久久久久久久久久久| 欧美最猛性xxxxx亚洲精品| 日韩成人xxxx| 亚洲精品自拍第一页| 91高清免费视频| 78m国产成人精品视频| 成人在线激情视频| 国产一区二区动漫| 91久久久国产精品| 欧美裸体男粗大视频在线观看| 中文字幕自拍vr一区二区三区| 黑人巨大精品欧美一区二区| 国产综合在线视频| 欧美性猛交xxxx乱大交蜜桃| 日韩电影大全免费观看2023年上| 久久精品国产91精品亚洲| 久久人人爽人人| 亚洲最大在线视频| 亚洲国产美女精品久久久久∴| 亚洲无亚洲人成网站77777| 欧美午夜电影在线| 97国产精品视频人人做人人爱| 成人免费淫片aa视频免费| 国产精品久久久久久久久久久久久| 日韩美女在线观看| 亚洲色图欧美制服丝袜另类第一页| 亚洲国产精品va在线看黑人动漫| 欧美日韩精品在线播放| 久久亚洲影音av资源网| 深夜福利亚洲导航| 国产精品91久久久久久| 久久久久久久久电影| 亚洲精品456在线播放狼人| 欧美综合在线第二页| 久久久www成人免费精品| 欧美极品少妇xxxxⅹ免费视频| 国内揄拍国内精品少妇国语| 亚洲精品视频久久| 欧美寡妇偷汉性猛交| 国产美女被下药99| 日韩免费在线电影| 国产99久久久欧美黑人| 欧美与欧洲交xxxx免费观看| 中国日韩欧美久久久久久久久| 欧美天天综合色影久久精品| 国产精品久久久| 色香阁99久久精品久久久| 一本一道久久a久久精品逆3p| 久久躁狠狠躁夜夜爽| 亚洲丝袜一区在线|