面试官: 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 工具函数助力高效开发

相关文章
|
11天前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
11天前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
5天前
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
|
14天前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
5天前
|
存储 关系型数据库 MySQL
一天五道Java面试题----第八天(怎么处理慢查询--------->简述Myisam和innodb的区别)
这篇文章是关于Java面试中关于数据库性能优化和MySQL特性的五个问题,包括处理慢查询、ACID特性保证、MVCC概念、MySQL主从同步原理以及MyISAM和InnoDB存储引擎的区别。
|
13天前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
28 4
|
13天前
|
机器学习/深度学习 存储 PyTorch
【深度学习】Pytorch面试题:什么是 PyTorch?PyTorch 的基本要素是什么?Conv1d、Conv2d 和 Conv3d 有什么区别?
关于PyTorch面试题的总结,包括PyTorch的定义、基本要素、张量概念、抽象级别、张量与矩阵的区别、不同损失函数的作用以及Conv1d、Conv2d和Conv3d的区别和反向传播的解释。
35 2
|
13天前
|
存储 机器学习/深度学习 缓存
【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?
XGBoost与GBDT的区别、XGBoost使用泰勒二阶展开的原因、并行训练的原理、速度优势、防止过拟合的策略以及处理缺失值的方法,突出了XGBoost在提升模型性能和训练效率方面的一系列优化。
17 1
|
13天前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】 GBDT面试题:其中基分类器CART回归树,节点的分裂标准是什么?与RF的区别?与XGB的区别?
文章讨论了梯度提升决策树(GBDT)中的基分类器CART回归树的节点分裂标准,并比较了GBDT与随机森林(RF)和XGBoost(XGB)的区别,包括集成学习方式、偏差-方差权衡、样本使用、并行性、最终结果融合、数据敏感性以及泛化能力等方面的不同。
25 1
|
10天前
|
Java 调度
搞清楚wait、sleep、join、yield四者区别,面试官直接被征服!
掌握上述多线程控制方法的运用,可以在Java多线程程序编写中进行更加深入的线程管理,确保程序运行更加高效、稳定。在面试中准确并熟练地讲解这些概念,确实有可能让面试官对你的专业能力留下深刻印象。
17 0