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

JavaScript的call和apply

在 JavaScript 中,.call().apply() 都是 Function 原型上的方法,用于改变函数执行时的上下文对象(即 this 指向),它们的区别仅在于参数传递的形式不同。下面结合几个常见场景,说明它们的实际应用。


1. 基本语法

func.call(thisArg, arg1, arg2,);
func.apply(thisArg, [arg1, arg2,]);
  • thisArg:调用时函数内部 this 应该指向的对象。
  • 参数列表call 是逗号分隔的参数序列;apply 是一个数组(或类数组)一次性传入。

2. “借用”其它对象的方法

有时候 A 对象没有某个方法,但 B 对象有,想让 A 使用 B 的方法,就可以借用:

const objA = { x: 10 };
const objB = {x: 5,getX() {return this.x;}
};console.log(objB.getX());          // 5
console.log(objB.getX.call(objA)); // 10

这里用 call(objA)getX 中的 this 强制指向 objA,就实现了“方法借用”。


3. 传递可变参数(数组转展开)

如果要把一个数组作为参数列表传给函数,用 apply 更方便:

function sum(a, b, c) {return a + b + c;
}const nums = [1, 2, 3];
console.log(sum.apply(null, nums)); // 6

等价于:

console.log(sum.call(null, nums[0], nums[1], nums[2])); // 6

在 ES6 之前,这个技巧常用于 Math.max/Math.min 获取数组最大最小值:

const arr = [5, 1, 8, 3];
const max = Math.max.apply(null, arr); // 8
const min = Math.min.apply(null, arr); // 1

ES6+ 可直接写 Math.max(...arr),但在老环境或动态参数场景下,.apply 仍然有效。


4. 构造可重用的“类”或混入(Mixin)

当多个对象需要共享同一组方法时,可以用 call/apply 在初始化时添加属性:

function Person(name) {this.name = name;
}
Person.prototype.say = function () {console.log(`Hi, I'm ${this.name}`);
};function Employee(name, company) {Person.call(this, name);  // “继承” Person 构造函数this.company = company;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;Employee.prototype.getCompany = function () {console.log(this.company);
};const emp = new Employee('Alice', 'Acme Inc.');
emp.say();        // Hi, I'm Alice
emp.getCompany(); // Acme Inc.

这里 Person.call(this, name)Employee 构造函数复用了 Person 的初始化逻辑。


5. 在事件处理或异步场景中绑定上下文

在回调函数中,this 往往丢失。可用 callapply 手动指定:

const obj = {value: 42,getValueAfterDelay(delay) {setTimeout(function () {// 普通函数中 this 指向全局或 undefinedconsole.log(this.value);  }.call(this), delay);}
};obj.getValueAfterDelay(1000);
// 42

不过更常用的是 .bind(this),它会返回一个新的函数:

setTimeout(function () {console.log(this.value);
}.bind(obj), 1000);

6. 小结

  • 何时用 .call()
    需要显式地将若干个独立参数逐一传入,并指定 this

  • 何时用 .apply()
    参数已经以数组或类数组形式准备好,想“一次性”传递给函数。

  • .bind() 的关系

    • call/apply 立即执行函数并指定 this
    • bind 返回一个新函数,后续调用时 this 永久绑定。

掌握了这三种方法,就可以灵活地控制函数执行的上下文,以及参数的传递方式,特别是在函数复用、混入、事件回调、动态参数等场景中非常有用。

相关文章:

JavaScript的call和apply

在 JavaScript 中,.call() 和 .apply() 都是 Function 原型上的方法,用于改变函数执行时的上下文对象(即 this 指向),它们的区别仅在于参数传递的形式不同。下面结合几个常见场景,说明它们的实际应用。 1. …...

DiT、 U-Net 与自回归模型的优势

DiT 相对于 U-Net 的优势 全局自注意力 vs. 局部卷积 U-Net 依赖卷积和池化/上采样来逐层扩大感受野,捕捉全局信息需要堆叠很多层或借助跳跃连接(skip connections)。DiT 在每个分辨率阶段都用 Transformer 模块(多头自注意力 ML…...

开源 FcDesigner 表单设计器组件事件详解

FcDesigner 是一款基于Vue的开源低代码可视化表单设计器工具,通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率,节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 …...

Teigha应用——解析CAD文件(DWG格式)Teigha在CAD C#二次开发中的基本应用

Teigha是一款专为开发者设计的工具,其核心技术在于强大的API和丰富的功能集,提供了一系列工具和方法,使开发者能够轻松地读取、解析和操作DWG文件。它支持多种操作系统,能在处理大型DWG文件时保持高效性能,还可用于构建…...

C++23内存分配新特性:std::allocate_at_least

文章目录 一、背景与动机二、std::allocator::allocate_at_least的特性三、std::allocate_at_least的自由函数版本四、实际应用场景1. 动态容器的优化2. 自定义分配器 五、总结 在C23标准中, std::allocate_at_least和 std::allocator::allocate_at_least的引入为…...

JavaScript性能优化全景指南

JavaScript性能优化全景指南 Ⅰ. 加载性能优化 1.1 代码分割与懒加载 动态导入(ES2020) javascript // 路由级代码分割 const ProductPage () > import(/* webpackChunkName: "product" */ ./ProductPage.vue); // 交互驱动加载 document.querySelector(#char…...

04-jenkins学习之旅-java后端项目部署实践

1、创建被管理项目 2、构建流程说明 jenkins其实就是将服务部署拆分成了: 1、拉取代码(git) 2、打包编译 3、自定义脚本(jar复制、执行启动脚本) 4、部署成功后的一些通知等 3、demo配置 3.1、General 3.2 源码管理 添加用户名密码方式如下图 3.2.1 常见错误(r…...

基于Python flask 的豆瓣电影top250数据评分可视化

文章目录 基于Python flask 的豆瓣电影top250数据评分可视化项目简介项目结构效果展示源码获取 基于Python flask 的豆瓣电影top250数据评分可视化 博主介绍:✌安替-AnTi:CSDN博客专家、掘金/华为云//InfoQ等平台优质作者,硕士研究生毕业。专…...

Cat.4+WiFi6工业路由器介绍小体积大作用ER4200

ER42004G Cat.4WiFi6 工业路由器隶属于纵横智控ER系列,型号为ER4200,是一款坚固耐用、性能强大的网络设备,专为应对严苛环境而设计。它采用工业级品质设计,集成 4G Cat.4 全网络支持和 WiFi6 技术,可在稳定性和性能至关…...

大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3)

大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3) 资料取自《大模型应用开发:动手做AI Agent 》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的…...

创建型模式之Abstract Factory(抽象工厂)

创建型模式之Abstract Factory(抽象工厂) 摘要: 本文介绍了抽象工厂模式(Abstract Factory),它是一种创建型设计模式,提供了一种创建一系列相关对象的接口而无需指定具体类。文章通过手机工厂示…...

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【一】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

【DeepSeek论文精读】12. DeepSeek-Prover-V2: 通过强化学习实现子目标分解的形式化数学推理

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】10. DeepSeek-Coder-V2: 突破闭源模型在代码智能领域的障碍 【DeepSeek论文精读】12. De…...

字符串day7

344 反转字符串 字符串理论上也是一个数组&#xff0c;因此只需要用双指针即可 class Solution { public:void reverseString(vector<char>& s) {for(int i0,js.size()-1;i<j;i,j--){swap(s[i],s[j]);}} };541 反转字符串 自己实现一个反转从start到end的字符串…...

vue2中,codemirror编辑器的使用

交互说明 在编辑器中输入{时&#xff0c;会自动弹出选项弹窗&#xff0c;然后可以选值插入。 代码 父组件 <variable-editorv-model"content":variables"variables"placeholder"请输入模板内容..."blur"handleBlur" />data…...

FastAPI与MongoDB分片集群:异步数据路由与聚合优化

title: FastAPI与MongoDB分片集群:异步数据路由与聚合优化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author: cmdragon excerpt: FastAPI与MongoDB分片集群集成实战探讨了分片集群的核心概念、Motor驱动配置技巧、分片数据路由策略、聚合管道高级应用、分片…...

Perl单元测试实战指南:从Test::Class入门到精通的完整方案

阅读原文 前言:为什么Perl开发者需要重视单元测试? "这段代码昨天还能运行,今天就出问题了!"——这可能是每位Perl开发者都经历过的噩梦。在没有充分测试覆盖的情况下,即使是微小的改动也可能导致系统崩溃。单元测试正是解决这一痛点的最佳实践,它能帮助我们在…...

强大的免费工具,集合了30+功能

今天给大家分享一款免费的绿色办公软件&#xff0c;它涵盖了自动任务、系统工具、文件工具、PDF 工具、OCR 图文识别、文字处理、电子表格这七个模块&#xff0c;多达 30 余项实用功能&#xff0c;堪称办公利器。 作者开发这款软件的初衷是为了解决日常办公中常见的痛点问题&am…...

从0开始学习R语言--Day11--主成分分析

主成分分析&#xff08;PCA&#xff09; PCA是一种降维技术&#xff0c;它把一堆相关的变量&#xff08;比如身高、体重、年龄&#xff09;转换成少数几个不相关的新变量&#xff08;叫“主成分”&#xff09;&#xff0c;这些新变量能最大程度保留原始数据的信息。 核心理念 …...

通用前端框架项目静态部署到Hugging Face Space的实践指南

背景介绍 在轻量级展示前端项目的场景中,Hugging Face Space 提供了一个便捷的静态托管平台。需求是将无后端服务的Vite的 Vue项目部署到Hugging Face Space 上。其实无论是基于Vite的Vue/React项目,还是使用Webpack构建的工程化方案,都可以通过两种方式将其部署到Space:自…...

AI辅助写作 从提笔难到高效创作的智能升级

你是否经历过面对空白文档头脑空白的绝望&#xff1f;是否为整理实验数据通宵达旦&#xff1f;在这个信息爆炸的时代&#xff0c;一种新型写作方式正悄悄改变知识工作者的创作模式—AI辅助写作。这种技术既不像科幻作品里的自动生成机器人&#xff0c;也非简单的文字模板&#…...

十一、Samba文件共享服务

目录 1、Samba介绍1.1、Samba概述1.2、Samba服务器的主要组成部分1.3、Samba的工作原理2、Samab服务器的安装与配置2.1、安装samba2.2、Samba主配置文件2.2.1、全局设置段[global]2.2.2、用户目录段[homes]2.2.3、配置文件检查工具3、示例3.1、需要用户验证的共享3.2、用户映射…...

医疗影像检测系统设计与实现

以下是一个基于YOLO系列模型的医疗影像检测系统实现及对比分析的详细技术文档。由于目前官方YOLOv11尚未发布,本文将基于YOLOv8架构设计改进型YOLOv11,并与YOLOv8、YOLOv5进行对比实验。全文包含完整代码实现及分析,字数超过6000字。 # 注意:本文代码需要Python 3.8+、PyT…...

11.13 LangGraph记忆机制解析:构建生产级AI Agent的关键技术

LangGraph 持久化与记忆:构建具备记忆能力的生产级 AI Agent 关键词:LangGraph 持久化, 多回合记忆, 单回合记忆, 检查点系统, 状态管理 1. 记忆机制的核心价值 在对话式 AI Agent 的开发中,记忆管理直接决定了用户体验的连贯性和智能性。LangGraph 通过 多回合记忆(Mult…...

C++23中std::span和std::basic_string_view可平凡复制提案解析

文章目录 一、引言二、相关概念解释2.1 平凡复制&#xff08;Trivially Copyable&#xff09;2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的应用场景3.1 std::span的应用场景3.2 std::basic_string_view的应用场景 四、P2251R1提案对std::…...

[yolov11改进系列]基于yolov11引入感受野注意力卷积RFAConv的python源码+训练源码

[RFAConv介绍] 1、RFAConv 在传统卷积操作中&#xff0c;每个感受野都使用相同的卷积核参数&#xff0c;无法区分不同位置的信息差异&#xff0c;这都限制了网络性能。此外&#xff0c;由于空间注意力以及现有空间注意力机制的局限性&#xff0c;虽然能够突出关键特征&#xf…...

Springboot引入Spring Cloud for AWS的配置中心(Parameter Store和Secrets)

问题 现在手上有一个老Spring2.5.15项目&#xff0c;需要使用AWS Parameter Store作为配置中心服务。 思路 引入这个Spring版本对应的Spring Cloud&#xff0c;然后再引入Spring Cloud AWS相关组件。然后&#xff0c;在AWS云上面准备好配置&#xff0c;然后&#xff0c;启动…...

打破云平台壁垒支持多层级JSON生成的MQTT网关技术解析

工业智能网关的上行通信以MQTT协议为核心&#xff0c;但在实际应用中&#xff0c;企业往往需要将数据同时或分场景接入多个公有云平台&#xff08;如华为云IoT、阿里云IoT、亚马逊AWS IoT&#xff09;&#xff0c;甚至私有化部署的第三方平台。为实现这一目标&#xff0c;网关需…...

Modbus通信中的延迟和时间间隔详解

在工业自动化领域,Modbus协议作为最广泛使用的通信协议之一,其通信时序和延迟控制直接影响到系统的稳定性和效率。本文将深入探讨Modbus通信中涉及的各种延迟和时间间隔,帮助开发者更好地理解和应用这些概念。 一、串口Modbus通信中的延迟问题 1.1 为什么需要延迟? 在基…...

maven 最短路径依赖优先

问题描述&#xff1a; 项目在升级大版本后出现了&#xff0c;两个不同模块所引用的同一个依赖包版本不同 module A 引用了 module B&#xff0c;module B 引用了 A_1.0.jar->B_1.0.jar->C_1.0.jar(C 为B 里面的包) 在执行 mvn dependency:tree 后发现&#xff1a; modul…...