当前位置: 首页 > news >正文

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博客

相关文章:

Js的回调函数

一、什么是回调函数(Callback)? 回调函数(Callback Function)是指一个函数被作为参数传递给另一个函数,并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中&#xff0…...

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…...

PHP的扩展Imagick的安装

windows下的安装 下载:Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows​​​​​​​ 下载:ghostscript(PDF提取图片时用到,不处理PDF可以不安装) Ghostscript : Downloads 安装扩展 Imagick解压后&…...

【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…...

多台PC共用同一套鼠标键盘

当环境中有多个桌面 pc 需要操作的时候,在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接,但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse,通过移动光标在不同的 pc 间切换 s…...

大语言模型是如何训练出来的?

近期听了不少与AI相关的播客,有理想转型AI的分享,有Character.ai出来同事的分享等,结合对Transformer架构的理解尝试大致还原大语言模型的训练过程。不过,当我这样的“中国大妈”也能够大致琢磨明白大语言模型是如何训练出来的时候…...

Vue2与Vue3在项目开发中的选择:深入探讨

文章目录 前言一、Vue2的优势与挑战二、Vue3的进步与特性三、如何做出选择?结语 前言 Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。Vue2和Vue3是其两个主要版本,它们各自拥有一系列特点和优势。随着Vue3的发布,开发者们面临着在新…...

Web枚举:深入了解目标应用系统

Web枚举是渗透测试中重要的第一步,旨在全面收集目标系统的信息,以便后续攻击载荷的构建更具针对性和效率。本文将详细讨论如何通过各种方法识别目标Web应用的技术栈,并提取关键信息。 1. 识别目标系统的技术栈 技术栈指Web应用所依赖的技术组…...

RabbitMQ介绍与使用

RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器,基于 AMQP(高级消息队列协议)标准,使用 Erlang 编程语言构建。它是消息队列(MQ)的一种,广泛应用于分布式系统中&#x…...

从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…...

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

(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) 方法可以大大减少微调…...

huggingface/bert/transformer的模型默认下载路径以及自定义路径

当使用 BertTokenizer.from_pretrained(bert-base-uncased) 加载预训练的 BERT 模型时,Hugging Face 的 transformers 库会从 Hugging Face Model Hub 下载所需的模型文件和分词器文件(如果它们不在本地缓存中)。 默认情况下,这些…...

从 0 开始上手 Solana 智能合约

Solana CLI 基础知识 Solana CLI 是一个命令行界面工具,提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令,但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...

(六)CAN总线通讯

文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...

新一代智能工控系统网络安全合规解决方案

01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心,它通过集成人工智能、工业大模型、物联网、5G等技术,实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点,能够提升生产效率、保证产品质量…...

Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(一)时序约束的基本概念

1、基本概念 推荐阅读,Ally Zhou编写的《Vivado使用误区与进阶》系列文章,熟悉基本概念、tcl语句的使用。 《Vivado使用误区与进阶》电子书开放下载!! 2、Vivado中的语法例程 1)语法例程 约束的语句可以参考vivado…...

车载网络:现代汽车的数字心跳

在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…...

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 没有函数的重载&#xff0…...

w~自动驾驶~合集16

我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题:SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接:https://ar…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...