Js的回调函数
一、什么是回调函数(Callback)?
回调函数(Callback Function)是指一个函数被作为参数传递给另一个函数,并在特定事件发生或操作完成时执行。
可以通俗地理解为一种“委托”机制。
在JavaScript中,回调函数的应用非常广泛,例如:
异步操作:如定时器、AJAX请求等。
数组方法:如map、filter、reduce等高阶函数。
事件处理:如DOM事件监听。
二、一个简单例子
同步操作的例子:
// 模拟点餐函数
function orderFood(dish, callback) {console.log(`你点了 ${dish}`);// 厨房开始准备食物callback(dish);
}// 模拟厨房准备食物的回调函数
function prepareFood(dish) {console.log(`厨房正在准备 ${dish}`);
}// 用户点餐并委托厨房准备食物
orderFood('汉堡', prepareFood);//输出 你点了 汉堡 厨房正在准备 汉堡
在这个例子中,prepareFood 是一个回调函数,它被传递给 orderFood 函数。当用户点餐后,orderFood 函数调用 prepareFood 函数来通知厨房开始准备食物。
匿名回调函数
// 模拟点餐函数
function orderFood(dish, callback) {console.log(`你点了 ${dish}`);// 厨房开始准备食物callback(dish);
}// 用户点餐并委托厨房准备食物
orderFood('汉堡', function prepareFood(dish) {console.log(`厨房正在准备 ${dish}`);
});//输出 你点了 汉堡 厨房正在准备 汉堡
异步操作例子
假设准备食物需要一些时间,我们可以使用 setTimeout 来模拟异步操作。
// 模拟点餐函数
function orderFood(dish, callback) {console.log(`你点了 ${dish}`);// 模拟厨房准备食物需要2秒setTimeout(function() {callback(dish);}, 2000);
}// 模拟厨房准备食物的回调函数
function prepareFood(dish) {console.log(`厨房正在准备 ${dish}`);
}// 用户点餐并委托厨房准备食物
orderFood('汉堡', prepareFood);//输出
//你点了 汉堡
// 等待2秒后
//厨房正在准备 汉堡
在这个例子中,orderFood 函数使用 setTimeout 来模拟厨房准备食物需要2秒的时间。在2秒后,callback(dish) 被调用,即 prepareFood(dish) 被执行。
三、回调函数的特点
1、延迟执行(不会立即执行)
回调函数作为参数传递给一个函数的时候,传递的只是函数的定义并不会立即执行。在某个事件发生或操作完成后才被调用。这使得它们非常适合处理异步操作,如网络请求、文件读取、定时器等。
2、支持闭包
回调函数可以捕获其定义时的上下文(即闭包),这使得它们可以访问外部函数的变量和状态。
function createCounter() {let count = 0;return function() {count++;console.log(count);};
}const counter = createCounter();
counter(); // 输出: 1
counter(); // 输出: 2
四、回调函数中this指向问题
1、this关键字:
一个指针型变量,它指向当前函数的运行环境。即所在函数的调用者。
无论函数原本属于谁,从哪来的,判断this的唯一依据就是此刻函数的执行由那个对象调用的。
2、回调函数的this指向
注意在回调函数调用时this的执行上下文并不是回调函数定义时的那个上下文,而是调用它的函数所在的上下文。
3、解决方法:
以下面代码举例
function createData(callback) {callback();
}var obj = {data: 100,tool: function() {createData(function(n) {console.log(this, 1111); // window 1111});}
};obj.tool();
1、使用箭头函数
箭头函数不绑定自己的 this,它会捕获其所在上下文的 this 值。
var obj = {data: 100,tool: function() {createData(() => {console.log(this, 1111); // obj 1111});}};
2、使用 bind 方法
使用 bind 方法显式地绑定 this。
var obj = {data: 100,tool: function() {createData(function(n) {console.log(this, 1111); // obj 1111}.bind(this));}};
3、使用 var self = this
在外部保存 this 的引用。
var obj = {data: 100,tool: function() {var self = this;createData(function(n) {console.log(self, 1111); // obj 1111});}};
回调函数中的 this 指向问题通常是因为回调函数在全局作用域中被调用。可以通过以下几种方式解决:
箭头函数:捕获其所在上下文的 this 值。
bind 方法:显式地绑定 this。
var self = this:在外部保存 this 的引用。
选择哪种方法取决于你的具体需求和个人偏好。箭头函数通常是最简洁和推荐的方式。
五、回调函数其他例子
1、异步操作
setTimeout(function() {console.log('3秒后执行');
}, 3000);
在这个例子中,function() { console.log('3秒后执行'); } 就是一个回调函数,在3秒后由 setTimeout 调用。
2、数组方法
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(function(number) {return number * 2;
});
console.log(doubled); // 输出: [2, 4, 6, 8]
这里的 function(number) { return number * 2; } 是一个回调函数,用于对数组中的每个元素进行操作。
3、事件处理
document.getElementById('myButton').addEventListener('click', function() {console.log('按钮被点击了');
});
推荐博文:JS中的 回调函数(callback)_js回调函数-CSDN博客
相关文章:
![](https://i-blog.csdnimg.cn/img_convert/9abeba1b8fdcd729ed107dde0eec2e8b.png)
Js的回调函数
一、什么是回调函数(Callback)? 回调函数(Callback Function)是指一个函数被作为参数传递给另一个函数,并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
flutter 独立开发之笔记
1、# use: - [flutter_launcher_icons:] 每次修改完icon后,都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…...
![](https://www.ngui.cc/images/no-images.jpg)
PHP的扩展Imagick的安装
windows下的安装 下载:Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows 下载:ghostscript(PDF提取图片时用到,不处理PDF可以不安装) Ghostscript : Downloads 安装扩展 Imagick解压后&…...
![](https://www.ngui.cc/images/no-images.jpg)
【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想
以下问题应该都可以通过设置custom/conf/app.ini来解决 配置文档参考地址:https://www.bookstack.cn/read/gogs_zh/advanced-configuration_cheat_sheet.md domain显示的事localhost,实际上应该是一个IP地址。 关键字: DOMAIN ROOT_URL 因为是docker…...
![](https://i-blog.csdnimg.cn/img_convert/07bb08476fe3df7c8724d562fd82e4ee.png)
多台PC共用同一套鼠标键盘
当环境中有多个桌面 pc 需要操作的时候,在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接,但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse,通过移动光标在不同的 pc 间切换 s…...
![](https://www.ngui.cc/images/no-images.jpg)
大语言模型是如何训练出来的?
近期听了不少与AI相关的播客,有理想转型AI的分享,有Character.ai出来同事的分享等,结合对Transformer架构的理解尝试大致还原大语言模型的训练过程。不过,当我这样的“中国大妈”也能够大致琢磨明白大语言模型是如何训练出来的时候…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue2与Vue3在项目开发中的选择:深入探讨
文章目录 前言一、Vue2的优势与挑战二、Vue3的进步与特性三、如何做出选择?结语 前言 Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。Vue2和Vue3是其两个主要版本,它们各自拥有一系列特点和优势。随着Vue3的发布,开发者们面临着在新…...
![](https://www.ngui.cc/images/no-images.jpg)
Web枚举:深入了解目标应用系统
Web枚举是渗透测试中重要的第一步,旨在全面收集目标系统的信息,以便后续攻击载荷的构建更具针对性和效率。本文将详细讨论如何通过各种方法识别目标Web应用的技术栈,并提取关键信息。 1. 识别目标系统的技术栈 技术栈指Web应用所依赖的技术组…...
![](https://i-blog.csdnimg.cn/direct/9bf4bdfdc1484703b96784aa15ccb84d.png)
RabbitMQ介绍与使用
RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器,基于 AMQP(高级消息队列协议)标准,使用 Erlang 编程语言构建。它是消息队列(MQ)的一种,广泛应用于分布式系统中&#x…...
![](https://i-blog.csdnimg.cn/direct/2f5479000c5f4db9a5ba3ce34937b52d.png)
从0到机器视觉工程师(六):配置OpenCV和Qt环境
CMake配置OpenCV CMakeLists.txt文件的编写 cmake_minimum_required(VERSION 3.20) project(test_opencv LANGUAGES CXX) #寻找Opencv库 FIND_PACKAGE(OpenCV REQUIRED) include_directories(test_opencv ${OpenCV_INCLUDE_DIRS}) add_executable(test_opencv main.cpp) TARGE…...
![](https://i-blog.csdnimg.cn/direct/4f62f844bdc5415db07ef06ceacb8773.png)
计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
![](https://i-blog.csdnimg.cn/img_convert/01648d0248609f2d37be356a8c79cfd2.png)
(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应
LORA-FA:针对大型语言模型微调的内存高效低秩自适应 paper是香港浸会大学发表在Arxiv 2023的工作 paper title:LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING ABSTRACT 低秩自适应 (LoRA) 方法可以大大减少微调…...
![](https://www.ngui.cc/images/no-images.jpg)
huggingface/bert/transformer的模型默认下载路径以及自定义路径
当使用 BertTokenizer.from_pretrained(bert-base-uncased) 加载预训练的 BERT 模型时,Hugging Face 的 transformers 库会从 Hugging Face Model Hub 下载所需的模型文件和分词器文件(如果它们不在本地缓存中)。 默认情况下,这些…...
![](https://www.ngui.cc/images/no-images.jpg)
从 0 开始上手 Solana 智能合约
Solana CLI 基础知识 Solana CLI 是一个命令行界面工具,提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令,但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...
![](https://i-blog.csdnimg.cn/direct/ff60ece241ca43de86c102e414e62121.png)
(六)CAN总线通讯
文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...
![](https://i-blog.csdnimg.cn/img_convert/090ddef66350395f68bf5d2240e57803.jpeg)
新一代智能工控系统网络安全合规解决方案
01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心,它通过集成人工智能、工业大模型、物联网、5G等技术,实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点,能够提升生产效率、保证产品质量…...
![](https://i-blog.csdnimg.cn/direct/488fe627b0204475995ab0f89d9950bc.png)
Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(一)时序约束的基本概念
1、基本概念 推荐阅读,Ally Zhou编写的《Vivado使用误区与进阶》系列文章,熟悉基本概念、tcl语句的使用。 《Vivado使用误区与进阶》电子书开放下载!! 2、Vivado中的语法例程 1)语法例程 约束的语句可以参考vivado…...
![](https://i-blog.csdnimg.cn/img_convert/5be6efba75d988ccd39dd8680841e3d9.png)
车载网络:现代汽车的数字心跳
在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…...
![](https://i-blog.csdnimg.cn/direct/8a1f427f2c624567805645ed8a31ebfb.png)
python基础和redis
1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载࿰…...
![](https://i-blog.csdnimg.cn/img_convert/49150784165ba9ef502963dcb282256c.png)
w~自动驾驶~合集16
我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题:SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接:https://ar…...
![](https://www.ngui.cc/images/no-images.jpg)
最长的指定瑕疵度的元音子串
一、题目 最长的指定瑕疵度的元音子串 定义:开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如: “a” 、 "aa"是元音字符串,其瑕疵度都为0 "aiu…...
![](https://i-blog.csdnimg.cn/direct/d6f50f44528a4805a79e4a4ee80b2403.png)
每日算法Day15【组合、组合总和III、电话号码的字母组合】
77. 组合 算法链接: 77. 组合 - 力扣(LeetCode) 类型: 回溯 难度: 中等 回溯三步法: 1、确定参数返回值 2、确定终止条件 3、单层搜索逻辑 剪枝操作: 当path容量超过k时的数据可以不用遍历,故遍历边界条件判断: …...
![](https://i-blog.csdnimg.cn/direct/c30eb28c00ac4cfabdad12a5399c34e7.png)
C语言教程——指针进阶(2)
目录 一、函数指针数组 1.1函数指针数组写法 1.2函数指针用途 二、指向函数指针数组的指针 2.1概念 三、回调函数 3.1用法 3.2qsort排序 总结 前言 我们接着上一篇的函数指针往下学习。 一、函数指针数组 1.1函数指针数组写法 我们都知道指针数组,里面可以…...
![](https://www.ngui.cc/images/no-images.jpg)
调和级数不为整数的证明
文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3:2.4 核心证明: 3. 参考 1. 问题引入 s ( n ) 1 1 2 1 3 ⋯ 1 n , n ∈ N ∗ , n ≥ 2 s(n) 1\frac{1}{2}\frac{1}{3}\cdots\frac{1}{n}, \quad \\n \in N^*, n \ge2 s(n)12131⋯n1,…...
![](https://i-blog.csdnimg.cn/img_convert/bb182e637f36dc6ffe146dac958727bd.png)
基于微信小程序的在线学习系统springboot+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83A)
基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)
已完成功能: 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...
![](https://i-blog.csdnimg.cn/img_convert/ff95ee4eb6e4507b6389f70a5122935e.png)
有机物谱图信息的速查技巧有哪些?
谱图信息是化学家解读分子世界的“语言”,它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键,对化学家来说极为重要,每一种谱学技术都提供了不同的视角来观察分子,从而揭示其独特的化学和物理特性…...
![](https://www.ngui.cc/images/no-images.jpg)
Eureka缓存机制
一、Eureka的CAP特性 Eureka是一个AP系统,它优先保证可用性(A)和分区容错性(P),而不保证强一致性(C)。这种设计使得Eureka在分布式系统中能够应对各种故障和分区情况,保…...
![](https://www.ngui.cc/images/no-images.jpg)
【LC】78. 子集
题目描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出࿱…...
![](https://i-blog.csdnimg.cn/direct/6884a4b3f1de459982f1398e55849020.jpg)
协同过滤算法私人诊所系统|Java|SpringBoot|VUE|
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…...
方城网站制作/数据分析工具
XCode9和iOS11 beta了不知多少版本了,正式版本还没有正式发布。我也终于忍不了了,还是都做了升级。设备版本分别为: XCode:Version 9.0 beta 6 (9M214v) 10月13日更新GM版 iPhone:11.0(15A5370a) 下面的问题都是在iO…...
![](/images/no-images.jpg)
重庆网站设计/湖北疫情最新消息
AVS(Address Verification Service):验证信用卡交易的地址信息。 CSC(Card Security Code):信用卡安全码。 http://go.developer.ebay.com/developers/community/blogs/pp_integrations_preston/testing-paypal-payflow-gateway#comment-88495转载于:https://www.cnblogs.com/f…...
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
帮别人做网站的公司/万网阿里云域名查询
一、自动发现 1. 2自动注册详细配置 二、自动注册 1. . 2.自动注册详细配置 三 自动安装zabbix客户端脚本 #!/bin/bash #robinpath/etc/zabbix/zabbix_agentd.d/#安装zabbix源 rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm#…...
![](/images/no-images.jpg)
免费看电视的网站有哪些/新乡seo外包
今天做项目,几乎所有的提交都是通过ajax来提交,我测试的时候发现,每次提交后得到的数据都是一样的,调试可以排除后台代码的问题,所以问题肯定是出在前台。每次清除缓存后,就会得到一个新的数据,…...
![](/images/no-images.jpg)
云南seo整站优化报价/百度关键词竞价
roottimtest]$ mysqlbinlog -v mysql56-bin.000036 > a1.log 加上-v,就可以了...
![](/images/no-images.jpg)
河南郑州网站建设哪家公司好/建站推广网站
(linux操作系统下)#一 Django框架的安装与配置##1 环境配置步骤:1 安装python32 pip3.6 install pytz文件 --时间模块3 pip3.6 install Django文件4 pip3.6 install PyMySQL文件 --操作mysql模块5 pip3.6 install pillow文件 --图像处理库,项目中用到了验证码模块,所以需要导…...