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

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.dtcms.com/a/160052.html

相关文章:

  • Ascend C常见问题案例:含有Matmul高层API的算子精度问题
  • 【音视频】视频解码实战
  • Linux一个系统程序——进度条
  • 【基础篇】prometheus页面UI功能详解
  • C# 类(Class)教程
  • web 开发中,前端部署更新后,该怎么通知用户刷新
  • Java EE 计算机的操作系统
  • Python爬虫课程实验指导书
  • ZeroGrasp:零样本形状重建助力机器人抓取
  • Pikachu靶场-目录遍历
  • 单相交直交变频电路设计——matlab仿真+4500字word报告
  • Python multiprocessing.Pool中,pool.close() 和 pool.join() 的作用
  • 【JavaScript】关系运算符--非数值类型、Unicode编码表
  • Pmax非英语国家投广,Feed语言和货币问题解决策略
  • Laravel5.7的一些用法
  • DuckDB:现代数据分析的“SQLite“内核革命
  • 人类社会的第四阶段
  • web字符转义
  • 特伦斯智慧钢琴:开启智能钢琴新体验
  • 国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能)
  • FreeMarker语法深度解析与Node.js集成实践指南
  • 使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程
  • 高校毕业论文管理系统小程序实现
  • Spring MVC 多个拦截器的执行顺序
  • AI测试工具Testim——告别自动化测试维护难题
  • 开源|上海AILab:自动驾驶仿真平台LimSim Series,兼容端到端/知识驱动/模块化技术路线
  • git每次push都要输入用户名和密码很繁琐,只在第一次输入之后都不需要的解决方法
  • 企业架构之旅(1):TOGAF 基础入门
  • AI如何重塑DDoS防护行业?六大变革与未来展望
  • 【计算机网络分类全解析】从局域网到广域网的工程实践