3. bind,apply,call 三者的区别

Created
Sep 13, 2023 02:42 AM
Tags
JS基础
 
bind,call,apply的作用都是用来改变this指向的
使用.call()或者apply()的函数是会直接执行的 bind(()是创建一个新的函数,需要手动调用才会执行 .call()和.apply()用法基本类似,不过call搞收若干个参数,而apply接受的却是一个数组
call、apply、bind可以将某个函数的this指向修改为传入这三个方法中的第一个参数
第二个参数是传入要执行的方法中的参数,call、bind是独立传递参数,apply是以数组传递参数的
使用场景: 1、需要改变某个函数的this指向时 2、当参数较少时可以使用call,参数较多可以使用apply以数组的方式传递 3、当需要重复调用时,可以使用bind新定义一个方法
一个澳门的博主讲的 我觉得简单易懂。
 
声明两个变量分别为 Steven 和Becky 手机电量分别为百分之百分之70和百分之三十
而Steven有个充电宝,所以我们定义一个函数为charge 接收一个参数为level
const steven = { name: "Steven", phoneBattery: 70, charge: function (level) { this.phoneBattery = level } } const becky = { name: "Becky", phoneBattery: 30, }
console.log(steven) steven.charge(100) console.log(steven)
 
notion image
现在的话。Steven的手机充满电了
现在又有个需求。becky的手机也没电了。但是他不想去重新买个充电宝。所以就借Steven的用一下。
所以需要改下调用方式
console.log(becky) steven.charge.call(becky,95) console.log(becky)
notion image
ok了,现在becky的手机也充好电了。
为了演示apply 和call的不同。我们重新封装下charge这个函数。
const steven = { name: "Steven", phoneBattery: 70, charge: function (level1, level2) { this.phoneBattery = level1 + level2 } } const becky = { name: "Becky", phoneBattery: 30, }
如果是call的话,调用是这样的。
console.log(becky) steven.charge.call(becky, 30,50) console.log(becky)
notion image
如果是apply 调用是这样的。
console.log(becky) steven.charge.apply(becky, [30,50]) console.log(becky)
notion image
 
而bind 和上面这两种有不太一样。
就比如 becky要借Steven的充电宝,不是马上冲,而是过一会儿再充。
bind的调用方式是这样的。
console.log(becky) const beckyCharge = steven.charge.bind(becky) beckyCharge(30, 50) console.log(becky)
notion image
成功调用。
 
总结:call、apply 和 bind 的作用都是改变 this 的指向,其中 call 和 apply 的区别在于它们传参的方式不同——call可以传多个形参,而apply只能传一个数组形参。而bind和call、apply的区别在于bind不会立即调用,而是返回一个函数对象,因此开发中一般用bind比较多