函数原型中的 call 和 apply 方法的区别

简介: 它们是在 JavaScript 引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性。它们的作用一样,只是使用方式不同。

call, apply都属于Function.prototype的方法


它们是在 JavaScript 引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性。它们的作用一样,只是使用方式不同。


call 与 apply 调用参数不同

不同之处在于调用apply函数时,参数可以使用数组; call要求明确列出参数。

助记法: Apply 的A表示 Array, 即数组, 而 Call 的 C 表示 Comma, 即逗号。

更多请参阅MDN的文档。

伪语法:

theFunction.apply(valueForThis, arrayOfArgs)
theFunction.call(valueForThis, arg1, arg2, ...)

从ES6开始,还有展开spread数组与该call功能一起使用的可能性,你可以在这里看到兼容性。

示例代码:

function theFunction(name, profession) {
    console.log("My name is " + name + " and I am a " + profession +".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");
theFunction.call(undefined, ...["Matthew", "physicist"]); // 使用展开语法


搞这么复杂,直接调用函数不好吗?

主要是为了模拟面向对象,对状态进行封装的同时, 不同实例可以有不同的内部状态,如:

var module = {
  x: 42,
  getX: function() {
    return this.x;
  }
}
var unboundGetX = module.getX;
console.log(unboundGetX()); // 函数在全局范围内调用,this=window
// 会输出: undefined, 因为window下没有定义x
unboundGetX.call(module) //输出 42, 或使用 bind 也有同样的效果
var module1 ={
   x:123,
   getX: unboundGetX  //this 变为module1
}
module1.getX() //返回123
相关文章
|
机器学习/深度学习 自然语言处理 搜索推荐
AIGC音频生成行业应用路在何方?
【1月更文挑战第3天】AIGC音频生成行业应用路在何方?
241 1
AIGC音频生成行业应用路在何方?
|
存储 安全 编译器
指针的深入理解与陷阱
指针的深入理解与陷阱
|
前端开发 API
自定义 Hooks 在 Vue3 中的应用和重要性
自定义 Hooks 在 Vue3 中的应用和重要性
|
安全 Java 编译器
在Java中,什么是类型擦除机制,如何有效运用泛型的类型擦除机制?
Java的类型擦除机制在编译时移除了泛型的类型参数信息,生成的字节码不包含泛型,以确保向后兼容。这导致运行时无法直接获取泛型类型,但编译器仍做类型检查。为了有效利用类型擦除,应避免运行时类型检查,使用通配符和界限增加代码灵活性,通过超类型令牌获取泛型信息,以及利用泛型方法来保证安全性。理解这些策略能帮助开发者编写更安全的泛型代码。
322 8
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的高校汉服租赁网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的高校汉服租赁网站附带文章源码部署视频讲解等
157 0
【STM32】通过RTThread驱动W25QXXX
【STM32】通过RTThread驱动W25QXXX
435 0
|
负载均衡 Java 应用服务中间件
微服务技术系列教程(21) - SpringCloud- 负载均衡器Ribbon
微服务技术系列教程(21) - SpringCloud- 负载均衡器Ribbon
196 0
剑指 Offer 06:从尾到头打印链表
剑指 Offer 06:从尾到头打印链表
67 0
|
机器学习/深度学习 JSON 编解码
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL从表回收站中恢复误删的表
PolarDB MySQL提供表回收站的功能,删除的表会被临时转移到表回收站,本案例教您从表回收站恢复误删的表。

热门文章

最新文章