call apply bind原理和使用

callapplybind 是 JavaScript 中用来显式改变函数 this 指向的方法。它们主要用于函数上下文的转换或借用其他对象的方法。以下是它们的详细解释和使用方法:


1. call 方法

语法
func.call(thisArg, arg1, arg2, ...);
  • thisArg:指定 this 的值。
  • arg1, arg2, ...:要传给函数的参数列表。
特点
  • 立即执行 函数。
  • 参数是逐个传递的。
示例
function greet(greeting, punctuation) {console.log(`${greeting}, ${this.name}${punctuation}`);
}const person = { name: 'Alice' };
greet.call(person, 'Hello', '!');  // 输出: Hello, Alice!

2. apply 方法

语法
func.apply(thisArg, [argsArray]);
  • thisArg:指定 this 的值。
  • argsArray:将参数作为一个数组传递。
特点
  • 立即执行 函数。
  • 参数必须以数组或类数组形式传递。
示例
function greet(greeting, punctuation) {console.log(`${greeting}, ${this.name}${punctuation}`);
}const person = { name: 'Bob' };
greet.apply(person, ['Hi', '.']);  // 输出: Hi, Bob.
使用场景

当参数是动态生成的数组时,apply 会更方便。例如:

const numbers = [1, 2, 3, 4, 5];
console.log(Math.max.apply(null, numbers));  // 输出: 5

3. bind 方法

语法
const boundFunc = func.bind(thisArg, arg1, arg2, ...);
  • thisArg:指定 this 的值。
  • arg1, arg2, ...:预先传入的参数(可选)。
特点
  • 不立即执行,返回一个新函数,this 已绑定到指定对象。
  • 可以实现 柯里化(提前绑定部分参数)。
示例
function greet(greeting, punctuation) {console.log(`${greeting}, ${this.name}${punctuation}`);
}const person = { name: 'Charlie' };
const boundGreet = greet.bind(person, 'Hey');
boundGreet('!');  // 输出: Hey, Charlie!

对比总结

特性callapplybind
立即执行
参数形式逐个传递数组传递逐个传递(预绑定部分参数)
返回值函数执行结果函数执行结果绑定后的新函数

实际使用场景

借用方法

当一个对象没有某方法时,可以借用其他对象的方法来使用。

const obj = { name: 'David' };
const printName = function() { console.log(this.name); };printName.call(obj);  // 输出: David
伪数组转数组

使用 Array.prototype.sliceapply,可以将类数组(如 arguments)转换为真正的数组:

function toArray() {return Array.prototype.slice.apply(arguments);
}
console.log(toArray(1, 2, 3));  // 输出: [1, 2, 3]
事件绑定的 this 问题

在事件处理函数中,使用 bind 来确保 this 指向正确的对象:

class Button {constructor(name) {this.name = name;}click() {console.log(`Button clicked: ${this.name}`);}
}const btn = new Button('Submit');
document.querySelector('#myButton').addEventListener('click', btn.click.bind(btn));

代码练习

  1. callapply 的对比
function sum(x, y) {return x + y;
}console.log(sum.call(null, 2, 3));     // 输出: 5
console.log(sum.apply(null, [2, 3])); // 输出: 5
  1. 使用 bind 实现柯里化
function multiply(a, b) {return a * b;
}const double = multiply.bind(null, 2);
console.log(double(4));  // 输出: 8

总结

  • call:立即调用函数,参数逐个传递。
  • apply:立即调用函数,参数以数组形式传递。
  • bind:返回绑定了 this 的新函数,可延迟调用。

 

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

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

相关文章

2024.12.2——[极客大挑战 2019]Secret File 1

知识点:抓包 代码审计 filter伪协议 一、解题步骤 step 1 查看源代码中的信息 查看源代码发现一个php文件:[./Archive_room.php](http://72df1f22-85bf-47bb-b23a-efcaf88701d4.node5.buuoj.cn:81/Archive_room.php) 点进去后发现没什么用&#xff0c…

MKS EDGE Series RF Generators Power Solution 软件

MKS EDGE Series RF Generators Power Solution 软件

【汇编语言】标志寄存器(一) —— 标志寄存器中的标志位:ZF、PF、SF、CF、OF 一网打尽

前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优…

【C++】priority_queue优先队列

大家好,我是苏貝,本篇博客带大家了解C的string类的priority_queue优先队列,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 介绍2. 仿函数(A) 介绍(B) 控制比较逻辑 3. priority_queue和…

Python3 operator 模块

Python2.x 版本中,使用 cmp() 函数来比较两个列表、数字或字符串等的大小关系。 Python 3.X 的版本中已经没有 cmp() 函数,如果你需要实现比较功能,需要引入 operator 模块,适合任何对象,包含的方法有: o…

短视频矩阵系统开发|技术源代码部署

短视频矩阵系统通过多账号运营管理、多平台视频智能分发等功能,助力企业实现视频引流、粉丝沉淀和转化。 短视频矩阵系统是一种创新的营销工具,它整合了多账号管理、视频智能分发、数据可视化等多种功能,为企业在短视频领域的发展提供了强大…

YOLOV11 快速使用教程

概述 这里主要记录使用NVIDIA GPU pytorch 检测系列模型的快速使用方式,可以快速解决一些工业应用的问题,比如:无网、数据大需要改路径、需要记录不同实验结果等问题。 安装 参考官网,自己安装好Python > 3.8和pytorch >…

git修改某次commit(白痴版)

第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…

AI 建站:Durable

网址:https://app.durable.co 步骤 1) 登录 2)点击创建新业务 3)填写信息后,点击创建 4)进入业务 5)生成网站 6)生成完成后不满意的话可以自己调整 7)点击保存 8)发布 …

网络原理之 TCP 协议

目录 1. TCP 协议格式 2. TCP 原理 (1) 确认应答 (2) 超时重传 (3) 连接管理 a) 三次握手 b) 四次挥手 (4) 滑动窗口 (5) 流量控制 (6) 拥塞控制 (7) 延时应答 (8) 捎带应答 3. TCP 特性 4. 异常情况的处理 1) 进程崩溃 2) 主机关机 (正常流程) 3) 主机掉电 (…

Python爬虫之selenium库驱动浏览器

目录 一、简介 二、使用selenium库前的准备 1、了解selenium库驱动浏览器的原理 (1)、WebDriver 协议 (2)、 浏览器驱动(Browser Driver) (3)、 Selenium 客户端库 &#xff0…

Vite+Vue3项目实战:组件化开发与通信指南

一、典型的ViteVue3项目结构 续上文成功创建Vue3项目的脚手架,通过visual Studio Code软件打开刚刚创建的文件夹,将会看到这样一个项目结构。 使用Vite构建Vue3项目时,项目结构通常遵循一定的组织规则,以保持代码的清晰和可维护性…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车,搭载N62B48B发动机,累计行驶里程约为26万km。车主反映,发动机偶尔无法起动,故障频率较低,十几天出现1 次,且故障出现时起动机不工作。 故障诊断  接车后试车,…

团队管理中如何做好目标管理

团队管理中的目标管理是确保团队高效运行的核心要素之一。 在目标管理中,清晰的目标设定、合理的资源分配、实时的跟踪与反馈机制是成功的关键。首先,设定SMART目标(具体、可衡量、可达成、相关性强、时间限定)能够有效聚焦团队的…

【力扣热题100】—— Day4.反转链表

你不会永远顺遂,更不会一直年轻,你太安静了,是时候出发了 —— 24.12.2 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出&…

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode?二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…

记事本建java及java命名规范

1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…

过程管理系统(源码+文档+部署+讲解)

本文将深入解析“过程管理系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 过程管理系统是一款专为工业设计的综合管理平台,旨在通过集成各种管理流程和功能模块来提高管理效率和安全性。系统提供了从登录系…

期权懂|个股期权交割操作流程是什么样的?

期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权交割操作流程是什么样的? 一、行权申报: 期权买方在行权日通过其经纪商提交行权指令,表明其决定行使期权权利。 二、行权匹配&#xf…

智能仓储:入库业务流程介绍

01 入库流程 入库业务流程,常见过程是这样的: 创建PO单 > 创建到货清单 > 核对货物 > 入库质检 > 货物贴标签 > 上架 > 库存同步 1、创建PO单 po单指的是的采购订单,比如采购了一车货品,这车的货品可以理解…