详解call,apply,bind的区别

结论
方法名参数函数立即执行一次返回新函数
call单个按顺序传参
apply数组形式传参
bind单个形式传参

因为bind不会立即执行,所以和回调函数是绝配

call
  • 场景

函数get想要获取一个对象 lilei 的属性 this.name ,但是函数默认的this是指向window的,所以获取不到this.name这个值。

解决办法:使用call将函数get默认的this指向对象 lilei

  • code
function get(age,money) {
    console.log(this.name,age,money)
}
let lilei = {name:"lilei"}
get.call(lilei,20,2000) // output: lilei 20 2000
  • 特性
    • 调用call时,会立即执行一次函数
    • 第一个实参代表this,替换一次
    • 第二个实参往后,是传给function的参数
apply
  • 场景

函数get想要获取一个对象 lilei 的属性 this.name ,但是函数默认的this是指向window的,所以获取不到this.name这个值。

解决办法:使用apply将函数get默认的this指向对象 lilei

  • code
function get(age,money) {
    console.log(this.name,age,money)
}
let lilei = {name:"lilei"}
let arr = [20,2000]
get.apply(lilei,arr) // output: lilei 20 2000
  • 特性
    • 调用apply时,会立即执行一次函数
    • 第一个实参代表this,替换一次
    • 第二个实参必须是数组,apply回自动打散数组,作为function的参数
bind
  • 场景

需要反复调用this的情况下,call和apply就显得不太合适,会产生大量重复的代码。

解决办法:使用bind直接复制函数模板给新的函数,并且可以设定以一个固定的参数

  • code
function get(age,money) {
    console.log(this.name,age,money)
}
let lilei = {name:"lilei"}
let newFun = get.bind(lilei,20)
newFun(2000) // output: lilei 20 2000
newFun(3000) // output: lilei 20 3000
  • 场景2

bind和回调函数是绝配,因为call和apply会立即执行,而且没有返回值。

bind不会立即执行,也会返回一个新的函数。

下面使用一个定时器模拟异步请求

  • code
let lilei = {name:"lilei"}
setInterval(function get (age,money) {
    console.log(this.name,age,money)
}.bind(lilei,20,2000),2000) // output: 间隔两秒输出一次lilei 20 2000
  • 特性
    • bind会返回一个新的函数模板,并且不会立即执行
    • 第一个实参永久替换this
    • 允许第二个之后的实参,为固定值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知猪狭

恰饭恰饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值