用一个很生动的例子介绍call、apply和bind的用法

553 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

今天用一个很生动的例子介绍 JavaScriptcallapplybind 的用法。

使用object的方式建立两个人,jack和rose。

const jack = {
  name: 'jack',
​
}
const rose = {
  name: 'rose'
}

此时jack有一个手机,加入一个函数,叫做phone,接收一个参数,意思是打给谁。

const jack = {
  name: 'jack',
  phone: function (callname) {
    console.log(`${this.name} 打了一通电话给 ${callname}...`);
  }
}

然后jack打了一通电话给marry,询问她今晚吃饭的事情...

jack.phone('marry') // jack 打了一通电话给 marry...

这时,rose无意中听到了jack的通话,但是rose不想用自己的手机打,于是借用了jack的手机打给marry。 这个时候更改一下写法。 jack的手机借给了谁? 借给了rose;打给谁? 打给marry

jack.phone.call(rose, 'marry') // rose 打了一通电话给 marry...

为了演示 callapply 的不同,在 phone 上新加一个参数

const jack = {
  name: 'jack',
  phone: function (callname, callname2) {
    console.log(`${this.name} 打了一通电话给 ${callname}${callname2}...`);
  }
}
​
jack.phone.call(rose, 'marry', 'marry的妈咪')// rose 打了一通电话给 marry 和 marry的妈咪...

换成 apply,则把参数修改为数组即可。

jack.phone.apply(rose, ['marry', 'marry的妈咪'])// rose 打了一通电话给 marry 和 marry的妈咪...

如果换成 bind 的话,它会返回一个函数,意思是rose借用了jack的电话,不过是不是立即打电话,而是等一下在打。

const roseCallPhone = jack.phone.bind(rose)
roseCallPhone('marry', 'marry的妈咪') // rose 打了一通电话给 marry 和 marry的妈咪...

问:rose为什么要等一下在打? 答:因为她当时在打jack,可能腾不出手来...

完整代码如下:

const jack = {
  name: 'jack',
  phone: function (callname, callname2) {
    console.log(`${this.name} 打了一通电话给 ${callname}${callname2}...`);
  }
}
const rose = {
  name: 'rose'
}
​
​
jack.phone.call(rose, 'marry', 'marry的妈咪')// rose 打了一通电话给 marry 和 marry的妈咪...
​
jack.phone.apply(rose, ['marry', 'marry的妈咪'])// rose 打了一通电话给 marry 和 marry的妈咪...const roseCallPhone = jack.phone.bind(rose)
roseCallPhone('marry', 'marry的妈咪')// rose 打了一通电话给 marry 和 marry的妈咪...

总结:

call、apply和bind简单来说就是 把自己的方法借给别人使用

jack:不借行不行?

rose:不借我就锤你​ 💢💢💢

...

如果觉得文章写得不错,对你有所启发的,请不要吝啬 点个 关注 并在 评论区 留下你宝贵的意见哦~~😃