当前位置: 首页 > 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)

相关文章:

  • 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(新增大量好用功能)
  • 找化学的答案,解人类的命题:巴斯夫的“变革者”成长之道
  • 马上评丨机械停车库成“僵尸库”,设计不能闭门造车
  • 俄外长与美国务卿通电话,讨论俄美关系及乌克兰问题
  • 中日友好医院通报“医师肖某被举报”:基本属实,开除党籍并解聘
  • QFII一季度现身超300家公司:持有南京银行市值最高,5家青睐立航科技
  • 罗马教皇方济各葬礼在梵蒂冈举行