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

【js】Function.prototype.apply与Function.prototype.apply.call

这是一个非常经典的 JavaScript 底层机制问题,涉及到 Function.prototype 上的方法调用机制。


1. Function.prototype.apply 是什么?

这是 JavaScript 中所有函数对象继承的方法之一,用于 以指定 this 和参数数组调用函数

function foo(a, b) {console.log(this.x, a, b);
}foo.apply({x: 42}, [1, 2]); // 输出: 42 1 2

2. Function.prototype.apply.call 是什么?

这是 先拿到 apply 方法,再用 call 调用它。结构如下:

Function.prototype.apply.call(fn, thisArg, argsArray)

等价于:

fn.apply(thisArg, argsArray)

3. 区别总结

表达式等价于解释
Function.prototype.apply(fn, thisArg, [args])❌ 错误错误用法,apply 不是静态方法
Function.prototype.apply.call(fn, thisArg, [args])fn.apply(thisArg, [args])✅ 正确,借用 apply
Function.prototype.call.apply(fn, [thisArg, arg1, arg2])fn.call(thisArg, arg1, arg2)✅ 同理,借用 call

4. call 在这里的作用是什么?

Function.prototype.apply.call(fn, ...)

这个 .call 的作用是:

改变 apply 方法的调用者,使其作用于任意函数对象 fn,而不是默认的 Function.prototype

换句话说:

  • apply 是函数的方法,必须绑定在某个函数上调用
  • 使用 .call 是为了告诉引擎:“我现在要用 apply,但让它作用在 fn 上。”

5. 例子

function greet(name) {console.log(`Hello ${name}, I'm ${this.name}`);
}const person = { name: 'Alice' };// 正常写法
greet.apply(person, ['Bob']); 
// Hello Bob, I'm Alice// 使用 .call 借用 apply
Function.prototype.apply.call(greet, person, ['Bob']); // 同上// 使用 .apply 借用 apply
Function.prototype.apply.apply(greet, [person, ['Bob']]); // 同上// 使用 .bind 借用 apply
Function.prototype.apply.bind(greet)(person_apply, ['Bob']); // 同上// 使用 .call 借用 bind
Function.prototype.bind.call(greet, person_apply, 'Bob')(); // 同上

参考:
KIMI AI

http://www.xdnf.cn/news/1194157.html

相关文章:

  • 学习日志19 python
  • 电子电气架构 --- 高阶智能驾驶对E/E架构的新要求
  • 1.安装anaconda详细步骤(含安装截图)
  • Rust赋能土木工程数字化
  • Go的管道——channel
  • 大话数据结构之 < 栈>(C语言)
  • InfluxDB Flux 查询协议实战应用(二)
  • Voxtral Mini:语音转文本工具,支持超长音频,多国语音
  • 机器学习对中特估股票关键特征选取的应用与研究
  • pose调研
  • Ubuntu 18.04安装Fast-Lio2教程
  • 第10篇:实战验收篇
  • 【HTML】<script>元素中的 defer 和 async 属性详解
  • Flutter 提取图像主色调 ColorScheme.fromImageProvider
  • 摘录-打造第二大脑
  • Chessboard and Queens
  • 磁悬浮轴承(AMB)系统中引入转速频率陷波器失稳分析
  • MySQL 中 VARCHAR(50) 和 VARCHAR(500) 的区别
  • docker 从主机复制文件到容器外进行编辑
  • Pspice仿真电路:(三十四)如何使用Pspcie进行仿真
  • 定义域第一题
  • 速通python加密之SHA加密
  • SpringBoot总结
  • 广东省省考备考(第五十七天7.26)——数量、言语(强化训练)
  • 如何做数据增强?
  • 大模型面试回答,介绍项目
  • 高性能网络DPDK、RDMA、XDP初探
  • URL与URI:互联网世界的“门牌号“与“身份证“
  • 网络编程2(应用层协议,传输层协议)
  • 「iOS」————继承链与对象的结构