JavaScript 中 call 和 apply 的用法与区别
文章目录
- 前言
- 一、 call 方法
- 1.1 基本用法
- 1.2 传递多个参数
- 二、apply 方法
- 2.1 基本用法
- 2.2 传递数组参数
- 三、call 和 apply 的区别
- 四、实际应用场景
- 4.1 借用方法
- 4.2 继承与构造函数
- 五、总结

前言
在 JavaScript 中,call 和 apply 是两个非常重要的函数方法,它们都用于改变函数执行时的 this 指向。虽然它们的功能相似,但在使用方式上有一些区别。本文将详细介绍 call 和 apply 的用法及其区别。
一、 call 方法
1.1 基本用法
call 方法允许你调用一个函数,并且可以指定函数执行时的 this 值。call 方法的第一个参数是 this 值,后面的参数是传递给函数的参数列表。
function greet(message) {console.log(message + ', ' + this.name);
}
const person = {name: 'Alice'
};
greet.call(person, 'Hello'); // 输出: Hello, Alice
在上面的例子中,greet 函数通过 call 方法调用,this 被绑定到 person 对象,因此 this.name 输出 Alice。
1.2 传递多个参数
call 方法可以传递多个参数,这些参数会按顺序传递给函数。
function introduce(greeting, punctuation) {console.log(greeting + ', ' + this.name + punctuation);
}
const person = {name: 'Bob'
};
introduce.call(person, 'Hi', '!'); // 输出: Hi, Bob!
二、apply 方法
2.1 基本用法
apply 方法与 call 方法类似,也是用于改变函数执行时的 this 指向。不同的是,apply 方法的第二个参数是一个数组(或类数组对象),数组中的元素会作为参数传递给函数。
function greet(message) {console.log(message + ', ' + this.name);
}
const person = {name: 'Alice'
};
greet.apply(person, ['Hello']); // 输出: Hello, Alice
2.2 传递数组参数
apply 方法特别适合在参数数量不确定的情况下使用,因为你可以直接将参数放在一个数组中传递。
function introduce(greeting, punctuation) {console.log(greeting + ', ' + this.name + punctuation);
}
const person = {name: 'Bob'
};
introduce.apply(person, ['Hi', '!']); // 输出: Hi, Bob!
三、call 和 apply 的区别
虽然 call 和 apply 的功能相似,但它们在使用上有以下区别:
- 参数传递方式不同:call 方法接受的是一个参数列表,而 apply 方法接受的是一个参数数组。
func.call(thisArg, arg1, arg2, ...);
func.apply(thisArg, [arg1, arg2, ...]);
- 适用场景不同:当参数数量固定时,通常使用
call;当参数数量不固定时,使用apply更为方便。
四、实际应用场景
4.1 借用方法
call 和 apply 常用于借用其他对象的方法。例如,借用数组的 slice 方法将类数组对象转换为真正的数组。
function convertToArray() {return Array.prototype.slice.call(arguments);
}
const arr = convertToArray(1, 2, 3);
console.log(arr); // 输出: [1, 2, 3]
4.2 继承与构造函数
在实现继承时,call 和 apply 可以用于调用父类的构造函数。
function Parent(name) {this.name = name;
}
function Child(name, age) {Parent.call(this, name);this.age = age;
}
const child = new Child('Alice', 10);
console.log(child.name); // 输出: Alice
console.log(child.age); // 输出: 10
五、总结
call 和 apply 都用于改变函数执行时的 this 指向。
call 接受参数列表,apply 接受参数数组。
根据参数的数量和形式选择合适的调用方式。
掌握 call 和 apply 的使用,能够让你在 JavaScript 中更加灵活地控制函数的执行上下文,提升代码的复用性和可维护性。
希望这篇文章对你理解 JavaScript 中的 call 和 apply 有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。
相关文章:
JavaScript 中 call 和 apply 的用法与区别
文章目录 前言一、 call 方法1.1 基本用法1.2 传递多个参数 二、apply 方法2.1 基本用法2.2 传递数组参数 三、call 和 apply 的区别四、实际应用场景4.1 借用方法4.2 继承与构造函数 五、总结 前言 在 JavaScript 中,call 和 apply 是两个非常重要的函数方法&…...
go程序调用k8s pod副本的名称IP手动赋值给configmap的参数
1、创建configmap --- apiVersion: v1 data:config.yaml: >-# config.yamlEtcd:Endpoints:- "etcd-server:2379"Username: ""Password: ""Exchanges:#- Name: "Binance"# Symbol: "BTCUSDT"# WSUrl: "wss://fstr…...
面试系列|蚂蚁金服技术面【1】
哈喽,大家好!今天分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经,复盘面试过程中踩过的坑,整理面试过程中提到的知识点,希望能给正在准备面试的你一些参考和启发,希望对你有帮助,愿你能够获…...
使用傅里叶变换测量声卡的频率失真
文章目录 一、说明二、关于声卡的技术详述三、实验代码获取四、结论 一、说明 假如我希望使用我的声卡来模拟软件无线电,利用声音而不是射频信号。我的声卡能胜任这项任务吗?本文将研究一种技术来找出答案。另外,需要了解音频技术的读者也可…...
Selenium 自动化测试学习总结
大概了解一下即可,现在主要用的自动化工具是 playWright,它可以录制操作。 selenium是老款自动化测试工具,仍有很多可取之处。 安装: pip install selenium即可。然后下载浏览器的驱动包,注意不是浏览器!…...
【HTML5】01-HTML摆放内容
本文介绍HTML5摆放标签的知识点。 目录 1. HTML概念 2. HTML骨架 3. 标签的关系 4. 标题标签 5. 段落标签 6. 换行和水平线 7. 文本格式化标签 8. 图像标签 图像 - 属性 9. 路径 相对路径 绝对路径 10. 超链接标签 11. 音频标签 12. 视频标签 1. HTML概念 HTM…...
内存管理:
我们今天来学习一下内存管理: 1. 内存分布: 我们先来看一下我们下面的图片: 这个就是我们的内存,我们的内存分为栈区,堆区,静态区,常量区; 我们的函数栈帧开辟消耗的内存就是我们…...
设计模式使用Java案例
代码设计要有可维护性,可复用性,可扩展性,灵活性,所有要使用设计模式进行灵活设计代码 创建型 简单工厂模式(Simple Factory) 简单工厂模式(Simple Factory Pattern)是一种创建型…...
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南 一、核心概念对比 1. 本质区别 维度过滤器(Filter)拦截器(Interceptor)规范层级Serv…...
模运算的艺术:从基础到高阶的算法竞赛应用
在算法竞赛中,模运算(取模运算)是一个非常重要的概念,尤其在处理大数、防止溢出、以及解决与周期性相关的问题时。C 中的模运算使用 % 运算符,但它的行为和使用场景需要特别注意。 1. 模运算的基本概念 模运算是指求一…...
Java 并发编程——Java BIO NIO Socket编程
参考Java 并发编程——Java BIO NIO Socket编程 BIO:阻塞式编程模型 Socket 服务端编程Socket 客户端编程 NIO:非阻塞式编程模型 NIO 介绍Java 中 NIO 非阻塞式与前面 BIO 阻塞式的区别Java NIO类库包含以下三个核心组件ServerSocketChannel 服务端编程…...
ST电机库电流采样 三电阻单ADC
一、概述 下图是三电阻采样的电路结构 其中流过三相系统的电流I1、I2、I3遵循以下关系: 因此,为了重建流过普通三相负载的电流,在我们可以用以上公式计算的情况下,只需要对三相中的两相进行采样即可。 STM32的ADC可以很灵活的配置成同步采集两路ADC数据,…...
【网络】什么是 IHL(Internet Header Length,首部长度)TTL(Time To Live,生存时间)?
在 IPv4 数据报文中,IHL(Internet Header Length,首部长度)、TTL(Time To Live,生存时间) 和 TIL 涉及到 IP 数据包的结构和生命周期。以下是对它们的详细解释: 📌 1. IH…...
现代密码学 | 具有保密和认证功能的安全方案
1.案例背景 1.1 2023年6月,微软云电子邮件泄露 事件描述: 2023年6月,属于多家美国政府机构的微软云电子邮件账户遭到非法入侵,其中包括了多位高级政府官员的电子邮件。据报道,美国国务院的10个邮件账户中共有6万封电…...
一款基于Python的从常规文档里提取图片的简单工具开发方案
一款基于Python的从常规文档里提取图片的简单工具开发方案 1. 环境准备 安装必需库 pip install python-docx PyMuPDF openpyxl beautifulsoup4 pillow pip install pdfplumber # PDF解析备用方案 pip install tk # Python自带,无需安装工具选择 开发环…...
JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案
JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具,但从 2024.02 版本起,JetBrains 调整了试用政策,新用户不再享有默认的 30 天免费试用…...
Pytorch实现之BCGAN实现双生成器架构的人脸面部生成
简介 简介:通过双生成器架构与重建损失进行循环的生成训练,实现人脸面部表情合成。 论文题目:BCGAN: Facial Expression Synthesis by Bottleneck-Layered Conditional Generative Adversarial Networks (基于瓶颈分层条件生成对抗网络的面部表情合成) 会议:2021 15th…...
智慧加油站小程序数据库设计文档
智慧加油站系统 - 数据库与API设计文档 1. 数据库设计 1.1 ER模型 系统的核心实体关系如下: 用户(User) ---< 订单(Order) ---< 加油记录(RefuelRecord)| | || | vv v …...
Docker生存手册:安装到服务一本通
文章目录 一. Docker 容器介绍1.1 什么是Docker容器?1.2 为什么需要Docker容器?1.3 Docker架构1.4 Docker 相关概念1.5 Docker特点 二. Docker 安装2.1 查看Linux内核版本2.2 卸载老版本docker,避免产生影响2.3 升级yum 和配置源2.4 安装Dock…...
Linux内核传输层UDP源码分析
一、用户数据包协议(UDP) 1.UDP数据报头 UDP 提供面向消息的不可靠传输,但没有拥塞控制功能。很多协议都使用 UDP,如用于 IP 网络传输音频和视频的实时传输协议 (Real-time Transport Protocol,RTP),此类型…...
FPGA学习(二)——实现LED流水灯
FPGA学习(二)——实现LED流水灯 目录 FPGA学习(二)——实现LED流水灯一、DE2-115时钟源二、控制6个LED灯实现流水灯1、核心逻辑2、代码实现3、引脚配置4、实现效果 三、模块化代码1、分频模块2、复位暂停模块3、顶层模块 四、总结 一、DE2-115时钟源 DE2-115板子包含一个50MHz…...
E1-最远距离(stl使用)
题目描述 给定一个数组,请你找出数组中相同元素之间的最远距离。若数组中不存在相同元素,则输出 null。 输入描述 输入一个数组,数组长度不超过 10000。格式请见用例。 输出描述 输出数组中相同元素的最远距离。 用例 输入 [3, 2, 3,…...
Linux如何在设备树中表示和引用设备信息
DTS基本知识 dts 硬件的相应信息都会写在.dts为后缀的文件中,每一款硬件可以单独写一份xxxx.dts,一般在Linux源码中存在大量的dts文件,对于arm架构可以在arch/arm/boot/dts找到相应的dts,一个dts文件对应一个ARM的machie。 dtsi 值…...
Matlab 汽车振动多自由度非线性悬挂系统和参数研究
1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学,一般都是研究其悬…...
Maven核心包:maven-resolver-api
在阅读 nexus-pubic 开源项目过程中,使用了大量的核心组件进行轻量化集成。它的这种构建方式,在阅读过程中不得不感概,节省成本从构建项目的方式上就遥遥领先了。但是 maven核心包,依然使用前几年的aether-spi,却没有更…...
生活中的可靠性小案例11:窗户把手断裂
窗户把手又断了,之前也断过一次,使用次数并没有特别多。上方的图是正常的把手状态,断的形状如下方图所示。 这种悬臂梁结构,没有一个良好的圆角过渡,导致应力集中。窗户的开关,对应的是把手的推拉ÿ…...
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
074_ai辅助编程_水果程序_fruits_加法 回忆上次内容 上次直接从模块中导入变量、函数 from my_file import pi 导入my_file.pi 并作为 pi 使用 from my_file import pi as my_pi 导入变量 并 重命名 添加图片注释,不超过 140 字(可选) …...
【图论】并查集的学习和使用
目录 并查集是什么? 举个例子 组成 父亲数组: find函数: union函数: 代码实现: fa[] 初始化code: find code: 递归实现: 非递归实现: union code : 画图模拟: 路径压缩:…...
欢乐力扣:反转链表
文章目录 1、题目描述2、思路 1、题目描述 反转链表。 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 2、思路 借助cur指针和pre双指针来调整链表的前后指向。 # Definition for singly-linked list. # class ListNode: # def __i…...
1.8PageTable
页表的作用 虚拟地址空间映射:页表记录了进程的虚拟页号到物理页号的映射关系。每个进程都有自己的页表,操作系统为每个进程维护一个独立的页表。内存管理:页表用于实现虚拟内存管理,支持进程的虚拟地址空间和物理地址空间之间的…...
