自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

有關JavaScript中回調函數的所有內容!

開發(fā) 前端
回調函數是每個 JS 開發(fā)人員都應該知道的概念之一。回調用于數組,計時器函數,promise,事件處理程序等中。

[[375768]]

回調函數是每個 JS 開發(fā)人員都應該知道的概念之一?;卣{用于數組,計時器函數,promise,事件處理程序等中。

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

1.回調函數

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

  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數組的每一項,并使用每一項作為調用參數來調用函數greet():greet('小智'),greet('王大冶')。

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

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

高階函數承擔調用回調函數的全部責任,并為其提供正確的參數。

在前面的示例中,高階函數persons.map(greet)負責調用greet()回調函數,并將數組的每個項目作為參數:'小智'和'王大冶'。

我們可以可以自己編寫使用回調的高階函數。例如,這里有一個等價的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)是一個高階函數,因為它接受回調函數作為參數,然后在它的函數體內部調用回調函數:callback(item)。

2.同步回調回調的調用方式有兩種:同步和異步回調。

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

換句話說,同步回調處于阻塞狀態(tài):高階函數要等到回調完成執(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() 被調用 '); 
  10.   return `Hello, ${name}!`; 
  11. const persons = ['小智']; 
  12.  
  13. map(persons, greet); 
  14.  
  15. // map() 開始 
  16. // greet() 被調用  
  17. // map() 完成 

greet()是一個同步回調函數,因為它與高階函數map()同時執(zhí)行。

2.1 同步回調的例子

很多原生 JavaScript 類型的方法都使用同步回調。

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

  1. // 數組上的同步回調的示例 
  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.異步回調

異步回調在執(zhí)行高階函數之后執(zhí)行。

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

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

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

3.1 異步回調的示例

計時器函數的異步回調:

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

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

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

4. 異步回調函數 vs 異步函數

放在函數定義之前的特殊關鍵字async創(chuàng)建一個異步函數:

  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()是異步的,因為它的前綴是async。該函數await fetch('https://api.github.com/users?per_page=5')從 GitHub 前5個用戶。然后從響應對象中提取 JSON 數據:await resp.json()。

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

異步回調函數和異步函數是不同的術語。

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

但是,我們可以將異步函數用作異步回調!

我們異步函數fetchUserNames()設為單擊按鈕時調用的異步回調:

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

總結

回調是一個可以作為參數接受并由另一個函數(高階函數)執(zhí)行的函數.

有兩種回調函數:同步和異步。

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

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

 

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

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2019-11-05 10:03:08

callback回調函數javascript

2018-11-29 08:00:20

JavaScript異步Promise

2022-04-18 08:34:29

回調函數命令解析

2012-02-01 10:33:59

Java

2011-06-15 11:05:14

C語言回調函數

2021-06-07 09:44:10

JavaScript開發(fā)代碼

2011-05-20 17:59:06

回調函數

2023-11-10 16:31:31

2011-07-25 14:32:40

Cocoa 框架 函數

2022-04-12 08:30:52

回調函數代碼調試

2009-08-12 10:11:18

C# 回調函數

2011-05-20 17:19:25

回調函數

2009-08-19 17:10:09

C#回調函數

2009-11-04 11:32:20

VB.NET回調函數

2010-02-04 16:07:39

C++回調函數

2023-04-18 08:10:10

2022-03-08 11:17:54

函數指針回調函數C語言

2009-07-31 16:25:29

C#回調函數API應用

2010-01-06 16:40:11

.Net Framew

2011-07-05 10:27:26

JAVA閉包
點贊
收藏

51CTO技術棧公眾號