当前位置: 首页 > 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地址枯竭已经成为…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...