深入解析JavaScript中的回调函数(同步和异步)

回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。

深入解析JavaScript中的回调函数(同步和异步)

1、回调函数

首先写一个向人打招呼的函数。

只需要创建一个接受 name 参数的函数 greet(name)。这个函数应返回打招呼的消息:

function greet(name) {  return `Hello, ${name}!`;}greet('Cristina'); // => 'Hello, Cristina!'

如果向很多人打招呼该怎么办?可以用特殊的数组方法  array.map() 可以实现:

立即学习“Java免费学习笔记(深入)”;

const persons = ['Cristina', 'Ana'];const messages = persons.map(greet);messages; // => ['Hello, Cristina!', 'Hello, Ana!']

persons.map(greet) 获取 persons 数组的所有元素,并分别用每个元素作为调用参数来调用 greet() 函数:`greet('Cristina'), greet('Ana')

有意思的是 persons.map(greet) 方法可以接受 greet()  函数作为参数。这样 greet()  就成了回调函数

persons.map(greet) 是用另一个函数作为参数的函数,因此被称为高阶函数

回调函数作为高阶函数的参数,高阶函数通过调用回调函数来执行操作。

重要的是高阶函数负责调用回调,并为其提供正确的参数。

在前面的例子中,高阶函数 persons.map(greet) 负责调用  greet()  函数,并分别把数组中所有的元素 'Cristina'Ana ' 作为参数。

这就为识别回调提供了一条简单的规则。如果你定义了一个函数,并将其作参数提供给另一个函数的话,那么这就创建了一个回调。

你可以自己编写使用回调的高阶函数。下面是 array.map() 方法的等效版本:

function map(array, callback) {  const mappedArray = [];  for (const item of array) {     mappedArray.push(      callback(item)    );  }  return mappedArray;}function greet(name) {  return `Hello, ${name}!`;}const persons = ['Cristina', 'Ana'];const messages = map(persons, greet);messages; // => ['Hello, Cristina!', 'Hello, Ana!']

map(array, callback) 是一个高阶函数,因为它用回调函数作为参数,然后在其主体内部调用该回调函数:callback(item)

注意,常规函数(用关键字 function 定义)或箭头函数(用粗箭头 => 定义)同样可以作为回调使用。

2、同步回调

回调的调用方式有两种:同步异步回调。

同步回调是“阻塞”的:高阶函数直到回调函数完成后才继续执行。

例如,调用 map()greet() 函数。

function map(array, callback) {  console.log('map() starts');  const mappedArray = [];  for (const item of array) { mappedArray.push(callback(item)) }  console.log('map() completed');  return mappedArray;}function greet(name) {  console.log('greet() called');  return `Hello, ${name}!`;}const persons = ['Cristina'];map(persons, greet);// logs 'map() starts'// logs 'greet() called'// logs 'map() completed'

其中 greet()  是同步回调。

同步回调的步骤:

高阶函数开始执行:'map() starts'

回调函数执行:'greet() called'

.最后高阶函数完成它自己的执行过程:'map() completed'

同步回调的例子

许多原生 JavaScript 类型的方法都使用同步回调。

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

STORYD STORYD

帮你写出让领导满意的精美文稿

STORYD 137 查看详情 STORYD

// Examples of synchronous callbacks on arraysconst persons = ['Ana', 'Elena'];persons.forEach(  function callback(name) {    console.log(name);  });// logs 'Ana'// logs 'Elena'const nameStartingA = persons.find(  function callback(name) {    return name[0].toLowerCase() === 'a';  });nameStartingA; // => 'Ana'const countStartingA = persons.reduce(  function callback(count, name) {    const startsA = name[0].toLowerCase() === 'a';    return startsA ? count + 1 : count;  },   0);countStartingA; // => 1

字符串类型的 string.replace(callback)  方法也能接受同步执行的回调:

// Examples of synchronous callbacks on stringsconst person = 'Cristina';// Replace 'i' with '1'person.replace(/./g,   function(char) {    return char.toLowerCase() === 'i' ? '1' : char;  }); // => 'Cr1st1na'

3、异步回调

异步回调是“非阻塞的”:高阶函数无需等待回调完成即可完成其执行。高阶函数可确保稍后在特定事件上执行回调。

在以下的例子中,later() 函数的执行延迟了 2 秒:

console.log('setTimeout() starts');setTimeout(function later() {  console.log('later() called');}, 2000);console.log('setTimeout() completed');// logs 'setTimeout() starts'// logs 'setTimeout() completed'// logs 'later() called' (after 2 seconds)

later() 是一个异步回调,因为 setTimeout(later,2000) 启动并完成了执行,但是 later() 在 2 秒后执行。

异步调用回调的步骤:

高阶函数开始执行:'setTimeout()starts'

高阶函数完成其执行: 'setTimeout() completed'

回调函数在 2 秒钟后执行: 'later() called'

异步回调的例子

计时器函数异步调用回调:

setTimeout(function later() {  console.log('2 seconds have passed!');}, 2000);// After 2 seconds logs '2 seconds have passed!' setInterval(function repeat() {  console.log('Every 2 seconds');}, 2000);// Each 2 seconds logs 'Every 2 seconds!'

DOM 事件侦听器还异步调用事件处理函数(回调函数的子类型):

const myButton = document.getElementById('myButton');myButton.addEventListener('click', function handler() {  console.log('Button clicked!');});// Logs 'Button clicked!' when the button is clicked

4、异步回调函数与异步函数

在函数定义之前加上特殊关键字 async 会创建一个异步函数:

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

fetchUserNames() 是异步的,因为它以 async 为前缀。函数  await fetch('https://api.github.com/users?per_page=5') 从 GitHub 上获取前5个用户 。然后从响应对象中提取 JSON 数据:await resp.json()

异步函数是 promise 之上的语法糖。当遇到表达式 await  (调用  fetch()  会返回一个promise)时,异步函数会暂停执行,直到 promise 被解决。

异步回调函数和异步函数是不同的两个术语。

异步回调函数由高阶函数以非阻塞方式执行。但是异步函数在等待 promise(await )解析时会暂停执行。

但是你可以把异步函数用作异步回调!

让我们把异步函数 fetch UserNames() 设为异步回调,只需单击按钮即可调用:

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

总结

回调是一个可以作为参数传给另一个函数(高阶函数)执行的函数。

回调函数有两种:同步和异步。

同步回调是阻塞的。

异步回调是非阻塞的。

【相关推荐:javascript学习教程

以上就是深入解析JavaScript中的回调函数(同步和异步)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/835918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月27日 10:18:41
下一篇 2025年11月27日 10:29:39

相关推荐

  • Internet Computer(ICP)币是什么?如何运作?市场价格预测

    尽管加密货币市场整体遭遇显著回调,ICP币却展现出强劲的上涨势头,成为当前市场的焦点之一。数据显示,过去24小时内,ICP币价格上涨了13.1%,而在过去七天内更是实现了高达93.13%的惊人涨幅,几乎实现翻倍。目前,该代币市值已攀升至31.2亿美元,单日交易额激增至6.784亿美元,显示出市场参与…

    2025年12月9日
    000
  • HumidiFi(WET)币是什么?怎么样?HumidiFi工作原理、代币经济和路线图介绍

    humidifi 已迅速成为 solana defi 生态系统中的主导力量,凭借其专有的自动做市商方法改变了去中心化交易。  Binance币安 欧易OKX ️ Huobi火币️ 作为 Solana 上的顶级 AMM,它通过专注于卓越执行和流动性的低调、高效模式,占据了该链 DEX 交易量的很大一部…

    2025年12月9日 好文分享
    000
  • 加密货币术语黑话大全:HODL, FUD, FOMO是什么意思

    踏入加密货币世界,您会频繁遇到一些独特的“黑话”。理解这些术语是新手融入社区的第一步,它们能帮您更好地把握市场情绪和投资动态。 HODL:坚定的信仰者 1、HODL实际上源于一个拼写错误,本意是“HOLD”(持有),但因其生动地表达了在市场波动中坚定持币的信念而被广泛流传下来。 2、这个词代表着一种…

    2025年12月9日
    000
  • 谁是中本聪?揭秘比特币创始人的十大神秘传说

    “中本聪”是比特币创始人的化名,其真实身份至今成谜。这位神秘人物在2008年发布了比特币白皮书,并于2009年创造了首个区块,随后便销声匿迹,留下了无数传说。 个人身份的几大猜想 1、多利安·中本(Dorian Nakamoto):一位日裔美国物理学家,因姓名巧合一度被认为是中本聪本人,但他公开否认…

    2025年12月9日
    000
  • 从Ping到PayAI,X402协议如何引领AI经济体新模式?

            在这个时代中,传统的计算和交互模式面临着新的挑战,而x402协议的出现,则为ai经济体构建了一种全新的、高效且安全的运作模式。它不仅仅是一个技术规范,更是一种理念的 ,旨在解决ai系统间协作、价值交换和资源分配等核心问题。 从最初简单的“Ping”响应,到复杂的“PayAI”服务,X…

    2025年12月9日
    000
  • 免费查看币圈行情网站推荐_十大虚拟货币行情查询平台

    对于任何加密货币投资者来说,实时、准确的行情数据是做出明智决策的基础。本文将为您盘点十大免费且功能强大的虚拟货币行情查询平台,帮助您轻松掌握市场动态,从海量数据中发现价值。 1. 币安 (Binance) 作为全球领先的加密货币交易所,币安不仅提供交易服务,其网站和App内嵌的行情中心本身就是极佳的…

    2025年12月9日
    000
  • 虚拟币机构持仓怎么看 虚拟币机构持仓数量怎么看

    binance币安交易所 Binance币安注册入口: Binance币安APP下载: 欧易OKX交易所 欧易(OKX)注册入口: 欧易(OKX)注册APP下载: 火币HTX交易所: 注册入口: APP下载: 了解机构投资者的持仓动向,是洞察市场趋势和信心的重要窗口。对于普通投资者而言,掌握这些关键…

    2025年12月9日
    000
  • 十大交易所排行榜最新_2025全球十大数字货币交易所排名

    币安:交易量最大、币种最全,产品覆盖现货至理财;2. 欧易:衍生品强势,Web3账户成桥梁;3. 火币(HTX):历史悠久,亚洲影响力强;4. Gate.io:山寨币丰富,上新快;5. Coinbase:合规标杆,法币友好;6. Kraken:安全可靠,欧洲份额高;7. KuCoin:新兴项目多,社…

    2025年12月9日
    000
  • 币圈免费看行情网站合集_十大免费加密货币行情平台推荐

    对于加密货币投资者而言,实时、准确的行情数据是做出明智决策的基础。本文为您精选了十大顶级的免费加密货币行情平台,无论您是新手还是资深交易员,都能在这些网站上找到所需的市场信息、图表工具和深度数据,从而有效把握市场脉搏。 十大免费加密货币行情平台 1. 币安 (Binance) 作为全球领先的加密货币…

    2025年12月9日
    000
  • Farcaster协议是什么?去中心化社交的下一个风口?

    farcaster是一个足够去中心化的社交协议,致力于构建一个开放、自由的社交图谱。它将用户身份存储在链上,而将数据存储在链下的hub网络中,旨在让用户真正掌握自己的社交身份与数据,摆脱中心化平台的束缚。 Farcaster的核心特点 1、用户身份与数据所有权。用户的身份(如用户名)通过以太坊等区块…

    2025年12月9日
    000
  • 人工智能如何颠覆加密交易?详解3款AI交易机器人

    人工智能(ai)正以前所未有的方式重塑加密货币交易领域。ai技术通过强大的数据分析和自动化能力,为交易者提供了更高效、更智能的决策工具,彻底改变了传统交易模式。 AI如何重塑加密货币交易格局 1、人工智能能够实时处理和分析海量的市场数据,包括价格波动、交易量和历史图表。它能识别出人类难以察觉的复杂模…

    2025年12月9日
    000
  • Wormhole (W) 币是什么?跨链桥龙头项目的空投与价值分析

    主流币交易平台推荐: 欧易OKX: Binance币安: 火币Huobi: Gateio芝麻开门: Wormhole是领先的跨链消息传递协议,旨在连接不同区块链,实现资产和数据的无缝流转。其原生代币W的空投引发市场广泛关注,巩固了其作为跨链桥龙头项目的地位。 Wormhole (W) 核心价值 1、…

    2025年12月9日
    000
  • Pyth Network (PYTH) 是什么?预言机新星挑战Chainlink的底气何在?

    pyth network是一个新兴的去中心化预言机项目,旨在为区块链应用提供高保真、高频率的金融市场数据。它凭借独特的运行机制和强大的数据源,正迅速成为行业巨头chainlink的有力挑战者。 Pyth Network的核心机制是什么? 1、Pyth Network的核心是其首创的第一方数据源模式。…

    2025年12月9日
    000
  • Saga (SAGA) 币是什么?模块化游戏公链的空投与潜力解读

    saga是一个专注于游戏领域的模块化layer 1协议,它通过独特的“chainlet”架构,让开发者能轻松启动专用的并行链,极大地降低了web3游戏开发的门槛。 Saga的核心技术与特色 1、其核心是“Chainlet”无限扩展架构,开发者可以按需启动独立的、可互操作的专用链,从而彻底摆脱网络拥堵…

    2025年12月9日
    000
  • 币圈最新行情分析软件推荐 币圈实时行情分析APP大全

    想看懂币圈行情,选对工具是第一步。市面上的软件各有侧重,关键看你是想快速查价格、做深度技术分析,还是追踪市场情绪。下面这几个是2025年大家用得最多、口碑最好的选择,根据你的需求来挑就行。 交易所内置工具:看盘交易一体化 如果你主要在某个平台交易,那直接用它的App看行情是最方便的,省去了切换的麻烦…

    2025年12月9日
    000
  • 币圈行情分析软件十大排行榜单2026年

    1、欧易okx 欧易okx官网入口: 欧易okxAPP下载链接: 2、币安Binance 币安Binance官网入口: 币安BinanceAPP下载链接: 3、火币HTX 官网入口: APP下载链接: 4、大门Gate.io 官网入口: 官方APP下载链接: 在快速变化的数字资产市场中,一款强大的行…

    2025年12月9日
    000
  • 币圈最新消息软件推荐 币圈最新动态资讯软件大全

    想及时掌握币圈的最新消息和动态,关键是要选对工具。市场上没有哪个单一软件能覆盖所有信息,最有效的方法是组合使用几类不同功能的应用。行情数据、新闻快讯、社区讨论,每种信息都有其对应的优质平台。 综合交易平台内置资讯 大型交易所的App不仅用于交易,其内置的资讯系统也非常强大,能将信息与操作紧密结合。 …

    2025年12月9日
    000
  • 卡尔达诺(ADA)是什么?它和以太坊有何不同?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 卡尔达诺(ADA)是一个以学术研究为基础的第三代区块链平台,它旨在通过科学哲学和同行评审的方法,创建一个更具可扩展性、可持续性和互操作性的去中心化应用(DApp)和…

    2025年12月9日
    000
  • 波卡(DOT)是什么?“插槽拍卖”又是什么意思?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 波卡(Polkadot)是一个旨在实现区块链间互操作性的下一代协议,它允许独立的区块链相互通信和交换数据。其原生代币是DOT,在网络中扮演着至关重要的角色。 什么是…

    2025年12月9日
    000
  • 什么是稳定币?稳定币类型与对比

    稳定币是一类价格相对稳定的加密货币,通常与法币、贵金属或其他资产挂钩,旨在减少数字资产的价格波动。它在加密市场中被广泛用于支付、交易结算及去中心化金融(DeFi)应用。 稳定币类型 稳定币主要可分为以下几类: 法币支持型稳定币:由法币储备支持,如 USDT(Tether)、USDC,价格通常与美元 …

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信