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

JS 中call、apply 和 bind使用方法和场景

call 方法

  • 核心特性
  • 立即执行函数,并显式指定 this 值和逐个传递参数。
  • 语法:func.call(thisArg, arg1, arg2, …)
  • 使用场景

借用其他对象的方法

const person = { name: "Alice" };
function greet(greeting) {console.log(`${greeting}, ${this.name}!`);
}
greet.call(person, "Hello"); // 输出 "Hello, Alice!"

处理类数组对象

function sum() {const args = Array.prototype.slice.call(arguments); // 转为真实数组return args.reduce((acc, val) => acc + val, 0);
}
sum(1, 2, 3); // 输出 6

. 链式调用构造函数(继承场景)

function Parent(name) {this.name = name;
}
function Child(name, age) {Parent.call(this, name); // 调用父类构造函数this.age = age;
}
const child = new Child("Bob", 10);

apply 方法

  • 核心特性
  • 立即执行函数,并显式指定 this 值和以数组形式传递参数。
  • 语法:func.apply(thisArg, [argsArray])
  • 使用场景
  • 动态参数传递
const numbers = [5, 1, 9, 3];
const max = Math.max.apply(null, numbers); // ES5 中求数组最大值
console.log(max); // 输出 9
// ES6+ 替代方案:Math.max(...numbers)
  • 合并数组
const arr1 = [1, 2];
const arr2 = [3, 4];
arr1.push.apply(arr1, arr2); // 合并数组(等同于 arr1.push(...arr2))
console.log(arr1); // 输出 [1, 2, 3, 4]
  • 函数参数转发
function wrapper() {const args = Array.prototype.slice.call(arguments);// 将参数数组转发给其他函数doSomething.apply(this, args);
}

bind 方法

  • 核心特性
  • 不立即执行函数,而是返回一个绑定 this 的新函数,参数可预先固定。
  • 语法:func.bind(thisArg, arg1, arg2, …)
  • 使用场景
  • 延迟执行固定this
const user = { name: "Charlie" };
function showName() {console.log(this.name);
}
const boundShowName = showName.bind(user);
setTimeout(boundShowName, 1000); // 1秒后输出 "Charlie"
  • 事件监听器绑定上下文
class Button {constructor() {this.text = "Click me";this.element = document.createElement("button");// 绑定 this,确保回调中的 this 指向实例this.element.addEventListener("click", this.handleClick.bind(this));}handleClick() {console.log(this.text); // 输出 "Click me"}
}
  • 函数柯里化(部分参数固定)
function multiply(a, b) {return a * b;
}
const double = multiply.bind(null, 2); // 固定第一个参数为 2
console.log(double(5)); // 输出 10 (即 2 * 5)

三者对比

方法执行时机参数形式典型场景ES6+ 替代方案
call立即执行参数列表明确参数、借用方法扩展运算符 …
apply立即执行数组动态参数、数组合并扩展运算符 …
导bind返回函数参数列表(可部分)延迟执行、事件绑定、柯里化箭头函数(固定 this)
http://www.xdnf.cn/news/2496.html

相关文章:

  • 犬面部检测数据集VOC+YOLO格式987张1类别
  • ST-LINK/V2调试仿真器的接口定义
  • 计算机组成原理系列3--存储系统
  • 【QT】QT多线程
  • PMO 阶段性工作成果报告
  • 【C++QT】Layout 布局管理控件详解
  • STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换
  • 2025系统架构师---事件驱动架构
  • 开源|上海AILab:自动驾驶仿真平台LimSim Series,兼容端到端/知识驱动/模块化技术路线
  • Java大师成长计划之第5天:Java中的集合框架
  • AntBio: 2025 AACR Meeting - Charting New Oncology Frontiers Together
  • 计算机网络应用层(5)-- P2P文件分发视频流和内容分发网
  • RuntimeError: CUDA error: out of memory CUDA kernel errors might be 问题解决
  • TypeScript中的type
  • 220V转18V300mA非隔离电源芯片WT5105
  • 互联网大厂Java面试实录:从Spring Boot到微服务架构的技术问答
  • c++流对象
  • 什么是逐过程执行、逐语句执行和逐指令执行?GDB如何进行上述调试?
  • Codeforces Round 1021 (Div. 2) D. Baggage Claim(建图)
  • 三、UI自动化测试03--操作方法API
  • RPCRT4!NdrConformantStructUnmarshall函数分析的一个例子处理第二部分DomainSid
  • 【Nginx】负载均衡配置详解
  • 互联网大厂Java求职面试:从Java核心到微服务的深度探索
  • 【Android】硬件合成器 HWC
  • 4月27日日记
  • 基于spssau分析工具spss的简介
  • LeetCode 2444、1906、2682 题解(枚举右,维护左,前缀和)
  • 4.27算法题
  • AI-Browser适用于 ChatGPT、Gemini、Claude、DeepSeek、Grok的客户端开源应用程序,集成了 Monaco 编辑器。
  • adb push 报错:CreateProcess failure, error 123