JavaScript中的回调函数详解

JavaScript中的回调函数详解

1.1 概念

1.1.1 什么是回调函数

**回调函数(Callback Function)**是你将一个函数的引用(指针)作为参数传递给另一个函数,在那个函数完成任务后调用回来执行你传递的函数。简单的来说就是回调函数是作为参数传递给另一个函数,目的是让接受它的函数在特定条件满足、异步操作完成或事件发生的时候回调它

1.1.2 关键特征

  1. 传而不调用的机制
    • 你把函数A作为参数传递给B
    • 函数B暂时不调用A,而是保存它的引用
    • 当指定情况发生的时候,(事件触发/异步操作完成后),函数B才会调用它
// 经典回调结构
主函数(回调函数); // 传递时不执行function 主函数(cb) {// ...处理某些操作...cb(); // 满足条件时才回调(调用)
}
  • 回:让代码执行流程回到调用者
  • 调:由被调用方决定何时执行
  • 函数:传递的是一段可执行的代码逻辑

1.1.2 现实世界的比喻

想想你去饭馆点餐:

  1. 你点了一份需要时间才能做好的饭菜(启动异步任务)
  2. 服务员给你一个取餐号(获得回调标识)
  3. 你去座位上喝茶(继续执行主线程代码)
  4. 厨师完成菜肴(后台处理完成)
  5. 服务员喊你的号码:123取餐(触发回调)
  6. 你凭借着号码牌取餐(执行回调函数处理结果)

整个过程的关键:你不需要等待,系统会在合适的时间通知你

1.2 代码中的三种回调函数形式

2.1 同步回调

// 定义接收回调的函数
function processArray(arr, callback) {const result = [];for (const item of arr) {result.push(callback(item)); // 立即调用!}return result;
}// 使用
const doubled = processArray([1, 2, 3], x => x * 2);
console.log(doubled); // [2, 4, 6]

image-20250628140436137

2.2 异步回调(延迟回呼)

   //2.异步回调// 模拟异步任务function fetchData(url,callback){setTimeout(()=>{const data = `${url}获取的数据`;callback(data)},5000*4);}//使用 fetchData('api/users',data=>{console.log('收到的数据',data)})console.log("请求已发送,继续执行其他任务...")

img

2.3 事件回调

<Button id = "myButton">点击我</Button>

document.getElementById('myButton').addEventListener('click',()=>{console.log('按钮被点击了!')//当按钮被点击时执行
})

img

2.3.1 什么是事件回调

回调函数是指:将一个函数作为参数传递给另一个函数,并在特定事件发生或者条件满足时才被调用的函数

在事件处理中:

  1. 事件发生:用户执行了某些操作(比如点击按钮)
  2. 系统调用-浏览器自动出发之前“注册”的回调函数
  3. 执行操作-回调函数中的代码被执行

2.3.2 代码中的回调关系

//结构解析
元素.addEventListener('事件类型',回调函数)//具体实例:
document.getElementById('myButton').addEventListener(
'click'  //事件类型
() =>{
console.log('按钮被点击了!')  //回调函数
}
)

为什么是“回调”的三个关键点

  1. 函数作为参数传
    • ()=》{console.log(…)}这个匿名函数作为参数传递给了addEventListener()方法
  2. 延迟执行
    • 这个函数不会立即执行
    • 它会一直等待,直到特定事件(这里是点击事件)发生的时候才会被调用
  3. 反向调用
    • 你不是主动调用它
    • 而是由浏览器在事件触发时“反回来调用”你注册的函数
类比生活中的回调:

想象你寄快递:

  1. 你把包裹(回调函数)交给快递员(addEventListener
  2. 你告诉快递员:“当收件人签收时(事件发生),请通知我(执行操作)”
  3. 之后你就去做其他事(代码继续执行)
  4. 当收件人真正签收时(用户点击按钮),快递员打电话给你(执行回调函数)

2.3.3 回调的核心特点:

特点说明代码体现
注册机制需要提前设置好响应事件的函数addEventListener
异步性事件何时发生不确定代码注册后不立即执行
事件驱动由外部事件触发执行等待用户点击操作
反转控制权由系统调用你的代码浏览器控制函数调用时机

在JavaScript中,事件处理基本都是采用这种回调机制,这被称为事件驱动编程(Event-Driven Programming),是Web开发的核心模式之一。

所以叫它"事件回调",是因为你把一个函数("叫"它做什么)交给了事件系统,事件系统在特定事件发生后"回过来调用"你给它的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86788.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Utils系列之内存池(Fixed size)

内存池核心介绍 废话不多说&#xff0c;show you code. 我实现了两套内存池&#xff0c;一个是固定大小的内存池&#xff0c;一个是多重不同大小的内存池。 Fixed size memory pool 设计思路&#xff1a; 我们一个个看&#xff0c;首先我们定义了一个chunk, chunk 里面包含…

ubuntu安装docker遇到权限问题

问题现象&#xff1a; 使用snap安装的docker&#xff0c;执行docker build命令构建景象时报错&#xff1a; [] Building 0.1s (1/1) FINISHED docker:default > [internal] load build definition from Dockerfile 0.0s > > transferring dockerfile: 2B 0.0s ERROR:…

在Linux系统中部署Java项目

1.在Linux中启动mysql的服务: systemctl start mysql可以采用以下代码查看状态: systemctl status mysql如下图展示绿色代表启动成功 2.之后进入mysql mysql -uroot -p输入自己的密码&#xff0c;这里的密码不会显示,直接输入即可 3.在DG中连接Linux的数据库 4.修改配置文件…

C++洛谷P1002 过河卒

题目 链接&#xff1a;https://www.luogu.com.cn/problem/P1002 解析 这道题适用于了解动态规划的同学。 变量初始化 初始化B点坐标&#xff08;n, m&#xff09;和马的坐标&#xff08;a, b&#xff09; 初始化方向数组和动态规划数组 long long dp[30][30]; int dx[8] …

BlogX项目Go-gin--根据IP获取地理位置

先定义一个函数来判断IP地址是否为内网&#xff0c;归为工具类 // utils/ip/enter.go package ipimport "net"func HasLocalIPAddr(ip string) bool {return HasLocalIP(net.ParseIP(ip)) }// HasLocalIP 检测 IP 地址是否是内网地址 // 通过直接对比ip段范围效率更…

鸿蒙系统(HarmonyOS)应用开发之实现瀑布流图片展示效果

项目概述 科技图库是一款基于鸿蒙系统&#xff08;HarmonyOS&#xff09;开发的高品质图片浏览应用&#xff0c;专注于展示精选科技主题图片。应用采用现代化的瀑布流布局&#xff0c;为用户提供流畅、直观的浏览体验&#xff0c;让科技之美尽收眼底。 主要功能 1. 瀑布流布…

【fish-speech】新模型openaudio-s1-mini尝鲜

一、配置 显卡&#xff1a;v100&#xff08;测试简短语句&#xff0c;显存实际占用不足6G&#xff09; 二、安装测试 1. 安装 1.1 下载源码 git clone https://github.com/fishaudio/fish-speech.git1.2 安装系统组件 apt install portaudio19-dev libsox-dev ffmpeg1.3 …

介绍Windows下的由Sysinternals开发的一些小工具

Sysinternals是一个开发了很多Windows下系统工具的公司&#xff0c;这些工具能极大地提高对Windows系统的深入认知。就像它的名字Sys(tem)internals&#xff0c;深入系统里面。这些工具都放在微软的网站上可以下载到。https://learn.microsoft.com/en-us/sysinternals/ 下载网…

云服务器环境下Linux系统epoll机制与高并发服务器优化实践

在当今云计算时代&#xff0c;云已成为企业部署高并发服务的首选平台。本文将深入探讨Linux系统核心的epoll机制如何赋能云环境下的高并发服务器&#xff0c;解析其底层工作原理与性能优势&#xff0c;并对比传统IO复用模型的差异&#xff0c;帮助开发者构建更高效的云端服务架…

Java爬虫实战指南:按关键字搜索京东商品

在电商领域&#xff0c;快速获取商品信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。京东作为国内领先的电商平台之一&#xff0c;提供了丰富的商品数据。虽然京东开放平台提供了官方API来获取商品信息&#xff0c;但有时使用爬虫技术来抓取数据也是一种有…

aspose.word在IIS后端DLL中高并发运行,线程安全隔离

aspose.word在IIS后端DLL中运行,加载很慢,如何为全部用户加载,再每个用户访问时在各自线程中直接可以打开WORD文件处理 Aspose.Words 在 IIS 中优化加载性能方案 针对 Aspose.Words 在 IIS 后端 DLL 中加载缓慢的问题&#xff0c;我们可以通过单例模式预加载组件并结合线程安…

链表题解——回文链表【LeetCode】

一、算法逻辑&#xff08;通顺讲解每一步思路&#xff09; 我们从 isPalindrome 这个主函数入手&#xff1a; 步骤 1&#xff1a;找到链表的中间节点 middleNode 使用 快慢指针法&#xff08;slow 和 fast&#xff09; 快指针一次走两步&#xff0c;慢指针一次走一步。 当快…

allegro 铜皮的直角边怎么快速变成多边形?

像这种&#xff1a; 变成这种&#xff1a; 解决方案&#xff1a; shape edit boundary 点击铺铜边缘就能裁剪

从厨房到代码台:用做菜思维理解iOS开发 - Swift入门篇②

从厨房到代码台&#xff1a;用做菜思维理解iOS开发 - Swift入门篇② 本章重点​ 理解App开发的整体流程熟悉Xcode主界面结构与常用分区跟着步骤动手创建第一个App项目&#xff0c;认识模拟器掌握"打扫厨房"高频快捷键&#xff0c;解决常见疑难杂症 1、目标 像一个专…

EloqCloud for KV 初体验:兼容redis的云原生KV数据库

最近在做一些AI应用的时候&#xff0c;我在想尝试利用redis的能力缓存一些信息&#xff0c;这使我想去找一个免费的redis来进行使用&#xff0c;在调研的过程中我发现了一款产品EloqCloud for KV可以提供类似的能力&#xff0c;于是尝试使用了一下&#xff0c;本文记录了这次体…

企业级路由器技术全解析:从基础原理到实战开发

简介 在当今数字化时代,路由器作为网络的核心设备,其技术深度与应用广度直接影响着企业网络的性能与安全性。本文将全面解析路由器的基础原理、工作机制以及企业级开发技术,从网络层寻址到路由协议算法,从安全配置到QoS实现,再到多厂商API开发实战,旨在帮助网络工程师和…

day041-web集群架构搭建

文章目录 0. 老男孩思想-高薪四板斧1. web集群架构图2. 搭建异地备份服务2.1 服务端-阿里云服务器2.1.1 查看rsync软件包2.1.2 添加rsync配置文件2.1.3 添加虚拟用户2.1.4 创建校验用户密码文件2.1.5 创建备份目录2.1.6 启动服务2.1.7 开放安全组端口2.1.8 发送检查邮件 2.2 客…

day44-Django RestFramework(drf)下

1.5 Django RestFramework(下) drf 内置了很多便捷的功能,在接下来的课程中会给大家依次讲解下面的内容: 快速上手请求的封装版本管理认证权限限流序列化视图条件搜索分页路由解析器10. 分页 在查看数据列表的API中,如果 数据量 比较大,肯定不能把所有的数据都展示给用…

机器学习基础 线性回归与 Softmax 回归

机器学习基础 线性回归与 Softmax 回归 文章目录 机器学习基础 线性回归与 Softmax 回归1. 最小二乘法1.1 数据集定义1.2 最小二乘的矩阵推导1.3 最小二乘的几何解释1.4 概率视角下的最小二乘估计 2. 正则化2.1 L1 范数与 L2 范数2.2 正则化的作用2.3 Lasso 回归的求解2.3.1 L-…

6.27_JAVA_面试(被抽到了)

1.MYSQL支持的存储引擎有哪些, 有什么区别 ? In-no-DB&#xff08;默认&#xff09;&#xff1a;支持事务安全&#xff08;数据库运行时&#xff0c;能保证数据的一致性、完整性&#xff09;&#xff0c;支持表行锁&#xff0c;支持物理和逻辑外键。占用磁盘空间大。 MEMORY&…