面试官: call、apply和 bind有什么区别?

简介: 面试官: call、apply和 bind有什么区别?

640.jpg我们知道call、apply、bind 的作用是改变 this的指向,那么我们为什么要改变this的指向?

场景例子:

/* 
  改变this指向 call, apply 和 bind
*/
let obj = {
  name: '小红',
  say: function(sex, age) {
    console.log(this.name, sex, age'结果')
  }
}
obj.say('女', 12) 
// 打印结果 小红 女 12 
再建一个对象:
let obj2 = {
  name: '小明'
}
// obj2.say(); // Uncaught TypeError: obj1.sayHello is not a function

obj2也想用 say 方法且自己不创建,该怎么办?此时就需要用到这三个方法, 改变objthis指向, 将其指向obj2,就可以调用say方法

1、call

用法:call(target, arg1, arg2, ...), target 需要指向的目标对象,即boj2,arg1 为参数

let obj = {
  name: '小红',
  say: function(sex, age) {
    console.log(this.name, sex, age, '岁')
  }
}
let obj2 = {
  name: '小明'
}
obj.say.call(obj2, '男', 12)
// 小明 男 12 岁

2、apply

用法:apply(target, [arg1, arg2]), target 需要指向的目标对象,即boj2,arg1 为参数,参数为数组的形式

let obj = {
  name: '小红',
  say: function(sex, age) {
    console.log(this.name, sex, age, '岁')
  }
}
let obj2 = {
  name: '小明'
}
obj.say.apply(obj2, ['男', 12])
// 小明 男 12 岁

3、bind

用法:bind(target, arg1, arg2, arg3, ...), target 需要指向的目标对象,即boj2,arg1 为参数

let obj = {
  name: '小红',
  say: function(sex, age) {
    console.log(this.name, sex, age, '岁')
  }
}
let obj2 = {
  name: '小明'
}
obj.say.bind(obj2, '男', 12)()
// 小明 男 12 岁

总结

  1. call 和 bind 传参数的方式一样
  2. apply 传参数的方法为 数组的形式
  3. callapply立即执行的,但是bind则需要手动执行
  4. 共同点则是都是改变this的指向

往期:

面试官:JS判断对象为空有几种方法?

面试官:判断数组的方式有哪些

超全面的前端工程化配置指南

20 个 JS 工具函数助力高效开发

相关文章
|
25天前
|
存储 缓存 安全
面试题-HashMap底层原理与HashTable的区别
字节跳动面试题-HashMap底层原理与HashTable的区别
28 0
|
2月前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
36 1
|
9天前
|
Java
面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
16 1
|
9天前
|
Java
面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?
面试官:“小伙子,用过final关键字吗?” 我:“必须用过呀” 面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别” 我:“好嘞!
18 1
|
10天前
|
存储 安全 Java
面试官:请聊一聊String、StringBuilder、StringBuffer三者的区别
面试官:请聊一聊String、StringBuilder、StringBuffer三者的区别
36 8
|
25天前
|
存储 SQL NoSQL
面试题:char和varchar的区别?
字节面试题:char和varchar的区别?
24 0
|
25天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0
|
1月前
|
存储 JSON Java
面试官:Session和JWT有什么区别?
JSON Web Token (JWT) 是一种开放标准,用于安全地在网络上传输信息。JWT 包含头部、载荷和签名三部分,常用于身份验证和授权。与Session相比,JWT有以下优势:无服务器存储状态,支持跨域,适应微服务架构,自包含且可扩展。在Java开发中,可以使用HuTool框架操作JWT,包括生成、验证和解析Token。JWT通过在客户端存储令牌实现无状态认证,与Session的主要区别在于工作原理、存储方式和有效期管理。
35 6
|
2月前
|
消息中间件 算法 Java
面试官:Kafka和ES选主有什么区别?
Kafka 和 ES,作为大数据处理的中间件,分别用于流处理和全文检索。它们的选主(Kafka 的 Controller 和 ES 的 Master)都基于 Raft 算法实现一致性。Raft 算法通过选举确保分布式系统数据一致性,涉及领导者、追随者和候选人间的身份转换。当超过一半的节点投票给同一候选节点时,该节点成为新领导者。Kafka 和 ES 在此基础上可能有各自优化调整。更多关于 Raft 算法的详细流程和选举规则见原文。
46 2
|
2月前
|
网络协议 网络性能优化
网络面试题:TCP和UDP的区别
网络面试题:TCP和UDP的区别
25 0