call,apply,bind的用法、区别
一,call
call方法允许你调用一个函数,并显示的指定函数内部的this值,同时可以将参数**逐个
**传递给函数
举例说明
function testCall(describe, symblo) {
let name = '张三';
console.log(`${describe}, ${this.name}${symblo}`);
}
const objName = { name: '李四' };
// 使用 call 调用函数,并将 objName 作为 this 值
//call的第一个参数objName 用于指定this的值,即将objName 作为this传递给testCall函数
testCall.call(objName, 'Hello', '!'); //hello 李四!
二,apply
apply 方法与 call 类似,但它接收一个数组作为参数
,而不是逐个传递参数。
function testCall(describe, symblo) {
let name = '张三';
console.log(`${describe}, ${this.name}${symblo}`);
}
const objName = { name: '李四' };
// 使用 apply 调用函数,并将 objName 作为 this 值,这里要注意,入参是数组。
testCall.apply(objName, ['Hello', '!']); //hello 李四!
三,bind
方法
bind 方法会创建一个新的函数,这个新函数的 this 值被永久绑定到指定的对象,并且可以预先传递部分参数。
function testCall(describe, symblo) {
let name = '张三';
console.log(`${describe}, ${this.name}${symblo}`);
}
const objName = { name: '李四' };
// 使用 bind 创建一个新函数,并将 objName 作为 this 值
const bindTestCall= testCall.bind(objName , 'Hello');//bind方法在这会返回一个新的函数bindTestCall,objName 作为this值,hello作为第一个参数
// 调用绑定后的函数,并传递剩余参数!!
bindTestCall('!!');//Hello 李四!!
四,区别总结
- call和appky
1,调用函数并立即执行
2,区别在于函数传递方式
call 逐个传递参数
apply 传递一个参数数组 - bind
用于创建一个新的函数,将 this 值和部分参数绑定到原函数上,不会立即执行,而是返回一个新函数,在需要时调用。
五,使用场景
可以从一个对象借用另一个对象的方法
const zhangsan = {
name: '张三',
dealName: function() {
console.log(this.name);
}
};
const lisi = { name: '李四' };
// 借用 zhangsan 的 dealName 方法
zhangsan.dealName.call(lisi);//使用 call 将 lisi 作为 this 来调用 zhangsan 的 dealName 方法,这样 lisi 可以使用 zhangsan 的方法。