JavaScript函数传递的秘密武器:apply、call和bind的完全指南

news2024/11/25 3:02:48

在这里插入图片描述

😁 作者简介:一名大四的学生,致力学习前端开发技术
⭐️个人主页:夜宵饽饽的主页
❔ 系列专栏:JavaScript小贴士
👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气

​🔥​前言:

这是有关call和apply和bind三个函数方法的使用 ,还有它们与this的显示绑定有着深度的联系,如果有小伙伴对于this指向的概念不是很清楚的话,可以查看我的另外一篇博客,学习JavaScript的this的使用和原理,希望可以帮助到大家,欢迎大家的补充和纠正

文章目录

    • call()和apply(),bind()方法
      • 1 Function.prototype.call()方法
      • 2 Function.prototype.apply()方法
      • 3 Function.prototype.bind()方法
      • 4 这三种方法的区别:

call()和apply(),bind()方法

1 Function.prototype.call()方法

定义:

call() 是函数对象的一个方法,它用于调用函数并指定函数内部的 this 值,并且可以传递一个或多个参数给函数

语法:

function.call(thisArg, arg1, arg2, ...)

参数:

  • function 是要调用的函数。
  • thisArg 是要将作为 this 值传递给函数的对象。
  • arg1, arg2, … 是要传递给函数的参数(可选)

实例:

var person = {
  firstName: "John",
  lastName: "Doe",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

var anotherPerson = {
  firstName: "Jane",
  lastName: "Smith"
};

var fullName = person.fullName.call(anotherPerson);
console.log(fullName); // 输出 "Jane Smith"

call() 方法允许我们在 anotherPerson 对象上调用 person 对象的 fullName 方法,将 this 设置为 anotherPerson,以便正确访问 firstNamelastName 属性。

function fun(a,b){
    console.log('a ='+a);
    console.log('b ='+b);
    console.log('fun ='+this);
    this.syaName();
}

var obj={
    name:"obj",
    syaName:function(){
        console.log(this.name)
    }
};

// fun(2,3)

console.log("===============")

fun.call(obj,2,3);

运行结果

注意:默认fun()函数调用,this指向的是window对象,你可以使用call()调用函数,在调用的时候传入一个对象,这个对象就是this所指向的对象,也就是说,可以自己指定this的指向,然后从第二个参数开始,实参将会依次传递

2 Function.prototype.apply()方法

定义:

apply() 方法与 call() 方法类似,也用于调用函数并指定函数内部的 this 值,但不同之处在于它接受参数的方式。而 call() 方法将参数作为一个一个的参数传递,apply() 方法接受参数作为一个数组

语法:

function.apply(thisArg, [argsArray])

参数:

  • function 是要调用的函数。
  • thisArg 是要将作为 this 值传递给函数的对象。
  • argsArray 是一个包含要传递给函数的参数的数组。

实例:

function fun(a,b){
    console.log('a ='+a);
    console.log('b ='+b);
    console.log('fun ='+this);
}

var obj={
    name:"obj",
    syaName:function(){
        console.log(this.name)
    }
};

fun(2,3)

console.log("===============")

fun.call(obj,[2,3]);

注意:默认fun()函数调用,this指向的是window对象,你可以使用apply()调用函数,在调用的时候传入一个对象,这个对象就是this所指向的对象,也就是说,可以自己指定this的指向,然后从第二个参数开始,需要制定一个实参数组进行参数传递

3 Function.prototype.bind()方法

定义:

bind() 方法也用于改变函数的执行上下文(this 值),但与 call()apply() 不同,bind() 不会立即调用函数,而是返回一个新的函数,该新函数绑定了指定的上下文,可以稍后调用

语法:

function.bind(thisArg[, arg1[, arg2[, ...]]])

参数:

  • function 是要绑定上下文的函数。
  • thisArg 是要将作为 this 值传递给函数的对象。
  • arg1, arg2, … 是要传递给函数的参数(可选)。

实例:

var greet = function(greeting) {
  console.log(greeting + ", " + this.name);
};

var person = {
  name: "John"
};

var greetJohn = greet.bind(person, "Hello");
greetJohn(); // 输出 "Hello, John"

在上面的示例中,bind() 方法创建了一个新的函数 greetJohn,它在调用时将 this 设置为 person 对象,并在调用时传递 “Hello” 作为参数。不像 call()apply()bind() 并没有立即执行函数,而是返回了一个函数,可以稍后调用

4 这三种方法的区别:

  • 参数区别: call()apply() 接受参数列表或数组作为参数,而 bind() 接受参数列表作为逗号分隔的参数。
  • 在this的绑定的时候,call()和apply()方法实现的显示绑定是可能会丢失this的绑定,而bind()实现的是硬绑定,bind(…) 会返回一个硬编码的新函数,它会把参数设置为 this 的上下文并调用原始函数
    更加详情的this绑定知识请移步到 学习JavaScript的this的使用和原理的长篇博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:一文掌握MySQL索引

目录 概念优缺点索引的数据结构Hash索引有序数组索引二叉搜索树平衡二叉树B树B树 索引的物理结构MyISAM存储引擎InnoDB存储引擎 索引的分类页、区、段change buffer 和索引回表和覆盖索引索引优化面试题索引哪些情况下会失效什么是索引下推主键选择自增和uuid的区别 概念 官方…

一键混剪软件、根据模板批量剪辑、多种分割、多种合并、多种混剪、文案提取、文字转语音等

在这个短视频时代,视频剪辑已经成为了一个炙手可热的行业。但是,对于大多数人来说,视频剪辑是一项既复杂又繁琐的工作。不过,现在有了我们的新伙伴——视频闪闪,一键混剪软件,您将迎来全新的视频剪辑体验&a…

Spring源码编译步骤

Spring源码学习 一、Gradle 为什么下载gradle呢?我们平时不都是用maven吗?原因只有一个,spring源码是用gradle构建的,所以,你想看spring源码必须安装和学会使用gradle,那么,让我们开始gradle之…

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…

通讯录(C语言文件版本)(超详细过程)

❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️ ❇️❇️❇️❇️ 不同的信念 ❇️❇️❇️❇️ ❇️❇️❇️ 决定不同的命运 ❇️❇️❇️ ❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️ &#x1f4d6;通讯录 ✅具备的功能 ℹ️需要的头文件名 #include<…

二叉树按二叉链表形式存储,试编写一个判别给定二叉树是否是完全二叉树的算法

完全二叉树&#xff1a;就是每层横着划过去是连起来的&#xff0c;中间不会断开 比如下面的左图就是完全二叉树 再比如下面的右图就是非完全二叉树 那我们可以采用层序遍历的方法&#xff0c;借助一个辅助队列 当辅助队列不空的时候&#xff0c;出队头元素&#xff0c;入队头…

开发知识点-PHP从小白到拍簧片

从小白到拍簧片 位异或运算&#xff08;^ &#xff09;引用符号(&)strlen() 函数base64_encode预定义 $_POST 变量session_start($array);操作符php 命令set_time_limit(7200)isset()PHP 命名空间(namespace)new 实例化类extends 继承 一个类使用另一个类方法error_reporti…

如何利用Jmeter从0到1做一次完整的压测?这2个步骤很关键!

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压…

ADO实战指南

这里写目录标题 ADO概念ADO主要对象对象间的相互联系对象模型示意图 关键代码关于代码中的一些问题设置字符串连接对象OLE DB是什么&#xff1f;与ADO的关系是什么&#xff1f;执行命令时&#xff0c;使用连接对象来访问数据库。close与nothing做了什么事&#xff1f;连接对象为…

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

torch安装

https://download.pytorch.org/whl/torch_stable.html cp36 是python3.6的意思 python3.6对应torch1.8

外卖系统内部机理揭秘:了解更多

外卖系统是一个涉及多个环节和技术的复杂系统&#xff0c;包括前端用户交互、后端数据处理、订单管理和配送等多个方面。 技术架构概述&#xff1a; 前端应用程序&#xff1a; 包括用户界面和餐厅界面&#xff0c;常见的技术包括 HTML、CSS、JavaScript 和前端框架&#xff…

【入门Flink】- 06Flink作业提交流程【待完善】

Standalone 会话模式作业提交流程 代码生成任务的过程&#xff1a; 逻辑流图&#xff08;StreamGraph&#xff09;→ 作业图&#xff08;JobGraph&#xff09;→ 执行图&#xff08;ExecutionGraph&#xff09;→物理图&#xff08;Physical Graph&#xff09;。 作业图算子链…

【漏洞复现】Aapache_Tomcat_AJP协议_文件包含漏洞(CVE-2020-1938)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号CVE-2020-1938漏洞名称Aapache_Tomcat_AJP文件包含漏洞漏洞评级高…

el-select 搜索无选项时 请求接口添加输入的值

el-select 搜索无选项时 请求接口添加输入的值 <template><div class"flex"><el-select class"w250" v-model"state.brand.id" placeholder"请选择" clearable filterable :filter-method"handleQu…

关闭Dell xps 系列笔记本触控屏

【电脑】->【管理】->【设备管理器】 右键 禁用选择即可

怎么测量直线模组的精度?

直线模组是一款比较多变的一种产品&#xff0c;适合多种行业&#xff0c;同时它也适合比较多的环境&#xff0c;是一种比较全面的直线运动的装置。直线模组是非常精密的自动化机械设备&#xff0c;在实践中&#xff0c;应该要严格把握具体精度&#xff0c;并且在必要的时候&…

CDN加速是否对SEO有正面影响

当谈到网站性能优化和SEO&#xff08;搜索引擎优化&#xff09;时&#xff0c;CDN&#xff08;内容分发网络&#xff09;加速无疑是一个重要的话题。CDN是一种分布式网络基础设施&#xff0c;它通过将网站内容分发到全球各地的边缘服务器&#xff0c;从而加速内容的传递。在这篇…

apb介绍

https://www.cnblogs.com/xianyuIC/p/17279209.html***带testbench https://zhuanlan.zhihu.com/p/623829190?utm_id0 https://zhuanlan.zhihu.com/p/607964532带testbench by四人独行 https://blog.csdn.net/weixin_40377195/article/details/124899571 APB是最简单的AMBA总…

链表详讲(附代码)

1.什么是链表 链表是一种非常常见的数据结构&#xff0c;在程序设计中经常被使用。它由一系列节点组成&#xff0c;每个节点都有用来存放数据的数据区以及存放下一个节点地址指针的地址区。跟顺序表不同的是&#xff0c;链表的节点之间的空间并非是连续的&#xff0c;依靠地址区…