国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

有關(guān)JavaScript中回調(diào)函數(shù)的所有內(nèi)容!

開發(fā) 前端
回調(diào)函數(shù)是每個(gè) JS 開發(fā)人員都應(yīng)該知道的概念之一。回調(diào)用于數(shù)組,計(jì)時(shí)器函數(shù),promise,事件處理程序等中。

[[375768]]

回調(diào)函數(shù)是每個(gè) JS 開發(fā)人員都應(yīng)該知道的概念之一。回調(diào)用于數(shù)組,計(jì)時(shí)器函數(shù),promise,事件處理程序等中。

在本文中,會(huì)解釋回調(diào)函數(shù)的概念。另外,還會(huì)幫助智米們區(qū)分兩種回調(diào):同步和異步。

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

我們編寫一個(gè)問候的函數(shù),首先創(chuàng)建一個(gè)函數(shù)greet(name),該函數(shù)返回歡迎消息:

  1. function greet(name) { 
  2.   return `Hello, ${name}!`; 
  3.  
  4. greet('小智'); // => 'Hello, 小智!' 

如果要向一些人問候怎么做?這里,我們可以使用 array.map() 方法:

  1. const persons = ['小智''王大冶'
  2. const messages = persons.map(greet) 
  3.  
  4. messages // ["Hello, 小智!""Hello, 王大冶!"

persons.map(greet)接受person數(shù)組的每一項(xiàng),并使用每一項(xiàng)作為調(diào)用參數(shù)來調(diào)用函數(shù)greet():greet('小智'),greet('王大冶')。

有趣的是persons.map(greet)方法接受greet()函數(shù)作為參數(shù)。這樣做會(huì)使reet()成為回調(diào)函數(shù)。

persons.map(greet)是一個(gè)接受另一個(gè)函數(shù)作為參數(shù)的函數(shù),因此將其命名為高階函數(shù)。

高階函數(shù)承擔(dān)調(diào)用回調(diào)函數(shù)的全部責(zé)任,并為其提供正確的參數(shù)。

在前面的示例中,高階函數(shù)persons.map(greet)負(fù)責(zé)調(diào)用greet()回調(diào)函數(shù),并將數(shù)組的每個(gè)項(xiàng)目作為參數(shù):'小智'和'王大冶'。

我們可以可以自己編寫使用回調(diào)的高階函數(shù)。例如,這里有一個(gè)等價(jià)的array.map()方法

  1. function map(array, callback) { 
  2.   const mappedArray = []; 
  3.   for (const item of array) {  
  4.     mappedArray.push( 
  5.       callback(item) 
  6.     ); 
  7.   } 
  8.   return mappedArray; 
  9.  
  10. function greet(name) { 
  11.   return `Hello, ${name}!`; 
  12.  
  13. const persons = ['小智''王大冶'
  14.  
  15. const messages = map(persons, greet); 
  16.  
  17. messages // ["Hello, 小智!""Hello, 王大冶!"

map(array, callback)是一個(gè)高階函數(shù),因?yàn)樗邮芑卣{(diào)函數(shù)作為參數(shù),然后在它的函數(shù)體內(nèi)部調(diào)用回調(diào)函數(shù):callback(item)。

2.同步回調(diào)回調(diào)的調(diào)用方式有兩種:同步和異步回調(diào)。

同步回調(diào)是在使用回調(diào)的高階函數(shù)執(zhí)行期間執(zhí)行的。

換句話說,同步回調(diào)處于阻塞狀態(tài):高階函數(shù)要等到回調(diào)完成執(zhí)行后才能完成其執(zhí)行。

  1. function map(array, callback) { 
  2.   console.log('map() 開始'); 
  3.   const mappedArray = []; 
  4.   for (const item of array) { mappedArray.push(callback(item)) } 
  5.   console.log('map() 完成'); 
  6.   return mappedArray; 
  7.  
  8. function greet(name) { 
  9.   console.log('greet() 被調(diào)用 '); 
  10.   return `Hello, ${name}!`; 
  11. const persons = ['小智']; 
  12.  
  13. map(persons, greet); 
  14.  
  15. // map() 開始 
  16. // greet() 被調(diào)用  
  17. // map() 完成 

greet()是一個(gè)同步回調(diào)函數(shù),因?yàn)樗c高階函數(shù)map()同時(shí)執(zhí)行。

2.1 同步回調(diào)的例子

很多原生 JavaScript 類型的方法都使用同步回調(diào)。

最常用的是數(shù)組方法,例如array.map(callback),array.forEach(callback),array.find(callback),array.filter(callback),array.reduce(callback, init):

  1. // 數(shù)組上的同步回調(diào)的示例 
  2.  
  3. const persons = ['小智''前端小智'
  4. persons.forEach( 
  5.   function callback(name) { 
  6.     console.log(name); 
  7.   } 
  8. ); 
  9. // 小智 
  10. // 前端小智 
  11.  
  12. const nameStartingA = persons.find( 
  13.   function callback(name) { 
  14.     return name[0].toLowerCase() === '小'
  15.   } 
  16. // nameStartingA // 小智 
  17.  
  18. const countStartingA = persons.reduce( 
  19.   function callback(countname) { 
  20.     const startsA = name[0].toLowerCase() === '小'
  21.     return startsA ? count + 1 : count
  22.   },  
  23.   0 
  24. ); 
  25.  
  26. countStartingA // 1 

3.異步回調(diào)

異步回調(diào)在執(zhí)行高階函數(shù)之后執(zhí)行。

簡而言之,異步回調(diào)是非阻塞的:高階函數(shù)無需等待回調(diào)即可完成其執(zhí)行,高階函數(shù)可確保稍后在特定事件上執(zhí)行回調(diào)。

在下面的示例中,later()函數(shù)的執(zhí)行延遲為2秒

  1. console.log('setTimeout() 開始'
  2. setTimeout(function later() { 
  3.   console.log('later() 被調(diào)用'
  4. }, 2000) 
  5. console.log('setTimeout() 完成'
  6.  
  7. // setTimeout() 開始 
  8. // setTimeout() 完成 
  9. // later() 被調(diào)用(2秒后) 

3.1 異步回調(diào)的示例

計(jì)時(shí)器函數(shù)的異步回調(diào):

  1. setTimeout(function later() { 
  2.   console.log('2秒過去了!'); 
  3. }, 2000); 
  4.  
  5. setInterval(function repeat() { 
  6.   console.log('每2秒'); 
  7. }, 2000); 

DOM 事件監(jiān)聽器也是異步調(diào)用事件處理函數(shù)(回調(diào)函數(shù)的一種子類型)

  1. const myButton = document.getElementById('myButton'); 
  2.  
  3. myButton.addEventListener('click'function handler() { 
  4.   console.log('我被點(diǎn)擊啦!'); 
  5. }) 
  6. // 點(diǎn)擊按鈕時(shí),才會(huì)打印'我被點(diǎn)擊啦!' 

4. 異步回調(diào)函數(shù) vs 異步函數(shù)

放在函數(shù)定義之前的特殊關(guān)鍵字async創(chuàng)建一個(gè)異步函數(shù):

  1. async function fetchUserNames() { 
  2.   const resp = await fetch('https://api.github.com/users?per_page=5'); 
  3.   const users = await resp.json(); 
  4.   const names = users.map(({ login }) => login); 
  5.   console.log(names); 

fetchUserNames()是異步的,因?yàn)樗那熬Y是async。該函數(shù)await fetch('https://api.github.com/users?per_page=5')從 GitHub 前5個(gè)用戶。然后從響應(yīng)對(duì)象中提取 JSON 數(shù)據(jù):await resp.json()。

async函數(shù)是 Promise 的語法糖。當(dāng)遇到表達(dá)式await 時(shí)(注意,調(diào)用fetch()將返回一個(gè) promise),異步函數(shù)將暫停執(zhí)行直到該promise得以解決。

異步回調(diào)函數(shù)和異步函數(shù)是不同的術(shù)語。

異步回調(diào)函數(shù)由高階函數(shù)以非阻塞方式執(zhí)行。但是異步函數(shù)在等待promise(await )解析時(shí)暫停其執(zhí)行。

但是,我們可以將異步函數(shù)用作異步回調(diào)!

我們異步函數(shù)fetchUserNames()設(shè)為單擊按鈕時(shí)調(diào)用的異步回調(diào):

  1. const button = document.getElementById('fetchUsersButton'); 
  2.  
  3. button.addEventListener('click', fetchUserNames); 

總結(jié)

回調(diào)是一個(gè)可以作為參數(shù)接受并由另一個(gè)函數(shù)(高階函數(shù))執(zhí)行的函數(shù).

有兩種回調(diào)函數(shù):同步和異步。

同步回調(diào)函數(shù)與使用回調(diào)函數(shù)的高階函數(shù)同時(shí)執(zhí)行,同步回調(diào)是阻塞的。另一方面,異步回調(diào)的執(zhí)行時(shí)間比高階函數(shù)的執(zhí)行時(shí)間晚,異步回調(diào)是非阻塞的。

完~,感謝大家的觀看,我是小智,我去刷碗啦!

 

作者:Shadeed 譯者:前端小智 來源:dmitripavlutin 原文:https://dmitripavlutin.com/javascript-variables-practices/

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 大遷世界
相關(guān)推薦

2019-11-05 10:03:08

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

2018-11-29 08:00:20

JavaScript異步Promise

2022-04-18 08:34:29

回調(diào)函數(shù)命令解析

2012-02-01 10:33:59

Java

2021-06-07 09:44:10

JavaScript開發(fā)代碼

2011-06-15 11:05:14

C語言回調(diào)函數(shù)

2011-05-20 17:59:06

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

2023-11-10 16:31:31

2011-05-20 17:19:25

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

2009-08-12 10:11:18

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

2022-04-12 08:30:52

回調(diào)函數(shù)代碼調(diào)試

2011-07-25 14:32:40

Cocoa 框架 函數(shù)

2010-02-04 16:07:39

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

2009-11-04 11:32:20

VB.NET回調(diào)函數(shù)

2009-08-19 17:10:09

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

2022-03-08 11:17:54

函數(shù)指針回調(diào)函數(shù)C語言

2010-01-06 16:40:11

.Net Framew

2023-04-18 08:10:10

2009-07-31 16:25:29

C#回調(diào)函數(shù)API應(yīng)用

2011-07-05 10:27:26

JAVA閉包
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩小视频在线| 国产成人精品综合在线观看 | 久久99久久99精品蜜柚传媒| 国产美女久久久久| 日本免费在线观看| 日本高清视频一区| 亚洲综合激情另类小说区| 欧美一级二级三级视频| 欧美久久久久久一卡四| 91麻豆国产精品久久| 最近中文字幕mv2018在线高清| 亚洲福利电影网| 在线看片你懂的| 日韩视频一区二区| 欧美日韩精品免费观看视完整| 日韩免费观看视频| 国产不卡一区视频| 呦呦在线视频| 日韩暖暖在线视频| 91精品国产高清一区二区三区蜜臀| 91超碰免费在线| 国产区精品区| 欧美制服丝袜第一页| 伊人免费在线| 一区二区三区自拍| 日韩中字在线观看| 亚洲综合国产| 日本黄xxxxxxxxx100| 久久亚洲精品中文字幕蜜潮电影| 中文字幕欧美日韩精品| 国产精品99久久免费| 成人毛片视频网站| 日韩欧美在线免费| 99视频入口| 亚洲精品久久久久| 极品美女一区| caoporm超碰国产精品| www.成年人视频| 不卡一区二区中文字幕| 熟妇人妻va精品中文字幕| 欧美激情在线一区二区三区| 99视频免费| 亚洲大片免费看| 国产色在线 com| 亚洲国产三级网| 日本成人黄色免费看| 欧美电影在线观看网站| www.亚洲免费视频| 欧美a大片欧美片| 国产精品69久久| 极品日韩av| 一区二区三区四区国产| 久久久国产综合精品女国产盗摄| 东北一级毛片| 亚洲黄网站黄| 一区二区三区四区五区精品 | 亚洲永久精品免费| 日本久久一区二区| 免费高潮视频95在线观看网站| 欧美成在线观看| 一区二区免费不卡在线| 黄黄视频在线观看| 亚洲一级二级三级在线免费观看| 黄污视频在线观看| 欧洲美女免费图片一区| 日本特黄久久久高潮| 黄网站免费入口| 制服视频三区第一页精品| 高清在线一区二区| 国产日韩欧美一区二区三区乱码 | 日本三级在线观看网站| 久久99国产综合精品女同| 久久久久久久久国产一区| 国产精品国产三级国产专区51| 亚洲福利视频三区| 成人午夜亚洲| 国产精品一区二区三区免费| 日韩欧国产精品一区综合无码| 91精品国产乱码久久久久久蜜臀 | 久久人人九九| 99麻豆久久久国产精品免费 | 成人激情av在线| 国产综合久久久久影院| 老鸭窝av在线| 亚洲女人天堂色在线7777| 精品国产一区二区三区四区 | 日韩精品在线观看视频| 亚洲五月天综合| 午夜av一区二区三区| 欧美舌奴丨vk视频| 999国产视频| 国产网红主播福利一区二区| www在线免费观看视频| 国产精品99一区| av电影在线观看一区| 国产一二三区在线观看| 国产精品美女在线观看| www.亚洲免费av| 国内高清免费在线视频| 成人春色激情网| 国产精品久久久久久妇女6080 | 欧美日韩午夜剧场| 日本精品一区二区三区在线观看视频| 日韩视频专区| 欧美日韩国产美| 成人精品亚洲| 亚洲欧美日韩国产中文专区| 国产精品v一区二区三区| 美女在线一区| 久久青草福利网站| 99精品一区二区| 亚洲四虎影院| 久久香蕉视频网站| 亚洲精品一区二区精华| 亚洲中字在线| 色综合久久影院| 俄罗斯精品一区二区| 国产精品qvod| 欧美日韩亚洲精品一区二区三区| 中文字幕成人| 国产极品尤物在线| 日韩成人中文字幕| 久久国产精品区| 久久av色综合| 天堂资源在线亚洲视频| 91精品国产色综合久久久蜜香臀| 国产精品mm| 日本高清视频在线播放| 国产精品三区在线| 一本久久a久久免费精品不卡| 欧美a级成人淫片免费看| 992tv在线观看| 国产成人精品视频在线| 美女网站在线看| 免费成人进口网站| 精品视频在线播放免| 精品亚洲国内自在自线福利| 日韩伦理精品| 男女激情无遮挡| 成人97在线观看视频| 久久人人爽人人爽| 亚洲人成精品久久久| 蜜臀在线观看| av一区二区三区免费| 91精品免费观看| 久久国产尿小便嘘嘘| 欧美精品高清| 亚洲欧美日韩精品久久| 国产精品一区二区久久精品爱涩| 新版的欧美在线视频| av一区二区三区免费观看| 麻豆乱码国产一区二区三区| 国产精品国产三级国产三级人妇| 国产一区二区在线| 激情小视频在线观看| 色999日韩自偷自拍美女| 亚洲欧美国产制服动漫| 97久久超碰国产精品| 日韩精品a在线观看91| 国产精品久久久久久久久| 亚洲一区二区视频在线| 亚洲精品1区2区| 国产一区二区三区影视| 成年人免费网站| 久久久综合亚洲91久久98| 亚洲视频在线免费看| 综合av第一页| 亚洲一区二区伦理| 国产精品伦一区二区| heyzo在线观看| 欧美不卡1区2区3区| 久久久www成人免费精品| 亚洲午夜视频在线观看| 蜜桃视频一区二区三区| 日韩欧洲国产| 久久国产精品高清一区二区三区| 深夜福利成人| 久久免费精品视频| 欧美在线视频不卡| 成人手机电影网| 日韩精品1区| 蜜桃视频在线观看免费视频| 九七午夜视频| 一区不卡视频| 亚洲国产精品v| 中文字幕免费一区二区| 91tv亚洲精品香蕉国产一区| 成人在线小说| 精品成人av一区| 国产一区二区美女诱惑| 日本道不卡免费一区| a欧美人片人妖| 日韩精品123| www.超碰com| 先锋影音网一区| 国产区精品在线观看| 欧美成人国产va精品日本一级| 欧美一区二区播放| 亚洲综合色成人| 深夜视频一区二区|