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

call 和 apply:改变对象行为的秘密武器(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍 call 和 apply 的概念
    • 为什么需要 call 和 apply
  • 二、 call 和 apply 的语法和参数
    • call 和 apply 的语法和参数
  • 三、 call 和 apply 的区别
    • 调用方式的区别
    • 参数传递的区别
  • 四、使用 call 和 apply 的场景

一、引言

介绍 call 和 apply 的概念

callapply是JavaScript中的两个方法,它们都可以用来调用函数,并改变函数内部的this指向。

  • call的语法为函数名.call(obj,参数1,参数2,参数3……),它将函数作为一个方法绑定到指定对象上进行调用,并且将函数内部的this设置为指定的对象。

  • apply的语法为函数名.apply(obj,[参数1,参数2,参数3……]),它与call类似,但区别在于它将所有参数写在数组里面。

这两个方法的本质都是通过改变对象的内部指针,将特定函数作为一个方法绑定到指定对象上并进行调用。在某些情况下,函数可能需要在特定的对象上调用,而不是在全局上下文中调用,使用callapply方法可以将函数绑定到特定的对象上,以便在调用时能够正确地访问对象的属性和方法。

为什么需要 call 和 apply

在 JavaScript 中,callapply的作用都是在函数调用时改变函数的执行上下文,也就是函数内部的this。它们的使用场景如下:

  • 在函数作为对象方法的情况下,this会指向对象。如果需要在调用函数时改变this的指向,可以使用callapply方法。
  • 在某些情况下,函数可能需要在特定的对象上调用,而不是在全局上下文中调用。使用callapply方法可以将函数绑定到特定的对象上,以便在调用时能够正确地访问对象的属性和方法。

总之,callapply方法可以帮助我们在函数调用时根据需要改变函数的执行环境,从而实现更加灵活和可定制的代码。

二、 call 和 apply 的语法和参数

call 和 apply 的语法和参数

callapply的语法和参数具体如下:

  • call方法:
    • 语法:call((thisObj(,arg1(, arg2(, (,.argN)))))
    • 说明:
      • 第一个参数是表示要绑定的对象,如果调用时不传参,比如call()call(null)call(undefined),那么this都指向window对象。
      • 传递另一个函数的函数名,那么函数中的this指向这个函数的引用。
      • 传递字符串、数值或布尔类型等基础类型,那么函数中的this指向其对应的包装对象,如StringNumberBoolean
      • 传递一个对象,那么函数中的this指向这个对象。
  • apply方法:
    • 语法:apply((thisObj(,argArray)))
    • 说明:
      • 如果argArray不是一个有效的数组或者不是arguments对象,那么将导致一个TypeError
      • 如果没有提供argArraythisObj任何一个参数,那么Global对象将被用作thisObj,并且无法传递任何参数。

callapply的作用都是在函数调用时改变函数的执行上下文,也就是函数内部的this。它们的使用场景如下:

  • 在函数作为对象方法的情况下,this会指向对象。如果需要在调用函数时改变this的指向,可以使用callapply方法。
  • 在某些情况下,函数可能需要在特定的对象上调用,而不是在全局上下文中调用。使用callapply方法可以将函数绑定到特定的对象上,以便在调用时能够正确地访问对象的属性和方法。

三、 call 和 apply 的区别

调用方式的区别

callapply的主要区别在于调用方式不同:

  • call方法的语法为函数名.call(obj,参数1,参数2,参数3……),其中各个参数用逗号分隔。
  • apply方法的语法为函数名.apply(obj,(参数1,参数2,参数3……)),其中所有参数写在数组中。

尽管callapply的作用相同,但它们的使用方式略有不同。在实际应用中,可以根据具体需求选择使用哪种方法来调用函数。

参数传递的区别

callapply在参数传递方面也存在一些区别:

  • call方法可以传递任意数量的参数,参数之间用逗号分隔。
  • apply方法需要将参数传递给一个数组,数组中的元素就是要传递的参数。

下面是一个示例,展示了如何使用callapply方法以及它们之间的区别:

function sum(num1, num2) {return num1 + num2;
}// 使用 call 方法
var result1 = sum.call(null, 10, 20);
console.log(result1); // 使用 apply 方法
var result2 = sum.apply(null, [10, 20]);
console.log(result2); 

在上述示例中,定义了一个sum函数,它接收两个参数并返回它们的和。通过调用sum.call(null, 10, 20),将null作为this值,并传递了两个参数1020sum函数。通过调用sum.apply(null, [10, 20]),同样将null作为this值,并将一个包含参数1020的数组传递给sum函数。

尽管callapply的作用相同,但它们的使用方式略有不同。在实际应用中,可以根据具体需求选择使用哪种方法来调用函数。

四、使用 call 和 apply 的场景

callapply方法主要用于改变对象的上下文,在以下场景中比较常见:

  1. 改变对象的上下文:可以使用callapply方法将函数作为另一个对象的方法进行调用,从而改变函数内部this的值。
var obj1 = {name: 'John',sayHello: function() {console.log('Hello, ' + this.name);}
};var obj2 = {name: 'Alice'
};obj1.sayHello.call(obj2); 

在上面的示例中,有两个对象obj1obj2obj1有一个名为sayHello的方法。通过使用call方法,将obj2作为this值传递给sayHello方法,输出结果将会是Hello, Alice

  1. 实现继承:可以使用callapply方法来模拟继承。
function Parent() {this.name = 'parent';
}Parent.prototype.sayGoodbye = function() {console.log('Goodbye, ' + this.name);
}function Child() {// 调用父类构造函数,实现属性继承Parent.call(this); this.type = 'child';
}// 子类的原型指向父类的实例,实现方法继承
Child.prototype = Object.create(Parent.prototype); 
// 修复构造函数指向问题,确保子类的构造函数指向自己
Child.prototype.constructor = Child; var child = new Child();
child.sayGoodbye(); 

在上面的示例中,创建了一个父类Parent和一个子类Child。通过使用call方法,在子类的构造函数中调用父类的构造函数,实现属性继承。然后,通过设置子类的原型指向父类的实例,实现方法继承。最后,创建子类的实例,并调用sayGoodbye方法。

除了上述常见场景外,callapply方法还可以用于其他一些情况,例如在某些框架中进行事件绑定、延迟执行等。具体使用场景取决于具体的需求和代码结构。

相关文章:

call 和 apply:改变对象行为的秘密武器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

工作中 docker 的使用积累

2 进入 openwrt 容器 docker exec -it openwrt /bin/sh3 查看 docker 信息 docker info4 启动容器 4 挂载 overlay mount -t overlay overlay -o lowerdirA:B,upperdirC,workdirworker /tmp/test -t overlay : 指定要挂载的文件系统类型为 overlayoverlay: 指定…...

初识SpringSecurity

目录 前言 特点 快速开始 导入依赖 运行项目 访问服务 权限控制 实现UserDetails接口 添加SecurityConfig配置类 测试接口DemoController 设置权限控制authorizeHttpRequests 结果分析 总结 前言 Spring Security是一个强大且高度可定制的身份验证和访问控制框架…...

大数据讲课笔记1.4 进程管理

文章目录 零、学习目标一、导入新课二、新课讲解(一)进程概述1、基本概念2、三维度看待进程3、引入多道编程模型(1)CPU利用率与进程数关系(2)从三个视角看多进程 4、进程的产生和消亡(1&#xf…...

技术点:实现大文件上传

大文件上传 实现思路 对于大文件上传考虑到上传时间太久、超出浏览器响应时间、提高上传效率、优化上传用户体验等问题进行了深入探讨,以下初略罗列各个知识点的实现思路: 大文件上传对文件本身进行了文件流内容 Blob 的分割,使用 Blob.pr…...

记一次挖矿病毒的溯源

ps:因为项目保密的原因部分的截图是自己在本地的环境复现。 1. 起因 客户打电话过来说,公司web服务异常卡顿。起初以为是web服务缓存过多导致,重启几次无果后觉得可能是受到了攻击。起初以为是ddos攻击,然后去查看web服务器管理…...

day05-报表技术-图形报表

1、图表报表简介 ​ 在大数据时代,人们需要对大量的数据进行分析,帮助用户或公司领导更直观的察觉差异,做出判断,减少时间成本,而在web项目中除了表格显示数据外,还可以通过图表来表现数据,这种…...

【Spring】@Transactional事务属性详解

文章目录 1、事务传播行为注意事务传播行为在不同类之间调用生效Propagation.REQUIRED(默认传播行为)Propagation.REQUIRES_NEWPropagation.NESTED 2、事务的隔离级别隔离级别设置 3、设置事务异常回滚3.1、默认情况3.2、设置回滚异常3.3、设置不回滚的异常 4、超时时间5、只读…...

通过css3的锚定滚动属性,实现分页加载时让滚动条不闪动

html标签 <div scroll"handleScroll" id"list-container"style"overflow-anchor:auto;overflow-y: auto;height: 80vh"><ul id"talks"v-for"(item,index) in msgList":key"item.roleiditem.timeitem.conten…...

使用Selenium与Scrapy处理动态加载网页内容的解决方法

博客正文&#xff08;包含详细注释&#xff09; 引言 在爬虫技术领域&#xff0c;处理动态加载的网页内容常常是一项挑战&#xff0c;尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。 初探Seleni…...

Linux的权限(二)

目录 前言 文件类型和访问权限&#xff08;事物属性&#xff09; 补充知识 文件类型 文件操作权限 修改文件权限 chmod指令 文件权限值的表示方法 字符表示方法 8进制数值表示方法 权限有无带来的影响 修改文件角色 chown与chgrp指令 目录的rwx权限 补充知识 …...

网络服务IP属地发生变化的原因有哪些?

近期&#xff0c;许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的&#xff0c;而是发生了变动。这一现象引起了广大用户的关注和疑惑&#xff0c;对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑&#xff0c;我们对此现象进行了深入探究…...

OpenGL 着色器程序的保存和加载(二进制)

背景 为了提高OpenGL 着色器程序的编译和链接速度&#xff0c;我们可以将程序保存为二进制进行加载&#xff0c;可以大幅度提升加载效率。 方法 以下是加载和保存二进制程序的方法。 // 加载着色器程序的二进制文件到已创建的着色器程序中 bool loadPragram(const std::str…...

【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换

前言 【Unity 实用工具篇】| 游戏多语言解决方案&#xff0c;官方插件Localization 实现本地化及多种语言切换一、多语言本地化插件 Localization1.1 介绍1.2 效果展示1.3 使用说明 二、 插件导入并配置2.1 安装 Localization2.2 全局配置 三、多语言映射表3.1 创建多语言文本配…...

疯狂SQL转换系列- SQL for Tencent Cloud VectorDB

为了尽量保证使用者通过统一的SQL标准访问各类型数据库&#xff0c;我们这里开启了“疯狂SQL转换系列”。转换的语法效果不一定是最好的&#xff0c;更多是为用户提供一个统一的数据库交互体验。转换数据库目标的确认更多是内生的。基于我们对业务发展的需要。该向量库SQL转换的…...

Excel中的INDIRECT函数用法

当在 Excel 中使用 INDIRECT 函数时&#xff0c;它可以帮助我们通过引用字符串中的单元格地址来获取对应单元格的值。这个函数非常有用&#xff0c;特别是在需要动态地引用其他单元格的情况下。下面是 INDIRECT 函数的一些用法和示例&#xff1a; 基本用法&#xff1a; INDIREC…...

Spring-temp

IOC/DI实现步骤 1.配置元数据 2.实例化IOC 3.获取Bean 基于XML配置方式 管理组件 1.基于构造函数&#xff1a;有参、无参 2.基于静态工厂方法&#xff1a;有参、无参 依赖注入 1.构造函数 2.setter方法 Bean组件高级特性 1.作用域 2.生命周期 FactoryBean 基于注解 IOC Bean作…...

【C++干货铺】会搜索的二叉树(BSTree)

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言&#xff1a; 二叉搜索树 二叉搜索树概念 二叉搜索树操作 二叉搜索树的查找 二叉搜索树的插入 二叉搜索树元素的删除 ​二叉搜索树的实现 BSTree结点 …...

【Spring AOP】 动态代理

一.AOP常见的实现方式 1.Spring AOP 2.aspectJ 注意:spring使用的是aspectJ的注解,但实现是spring自身实现的. 二.AOP原理 Spirng AOP原理 , 基于动态代理实现的. 三.代理模式 作用就是提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类…...

NAT——网络地址转换

目录 一、概念 二、NAT的分类 1.静态NAT 1.1 静态NAT的配置 1.2 利用eNSP小实验加强对静态NAT的理解 2、动态NAT 三、NAPT——端口映射 四、Easy IP 使用一个公网地址可以让所有人都上公网 一、概念 随着Internet的发展和网络应用的增多&#xff0c;IPv4地址枯竭已经成为…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...