call、apply、bind的区别与用法
说到call、apply、bind
,其最主要的作用,是改变 this 的指向!!!
1.call、apply、bind 的简单使用
这三者都是函数的一个方法,那么使用的方式就出来了 .call() 、 .apply() 、.bind()
示例:
// 定一个普通函数
function func() {
console.log(this)
}
// 正常调用函数
func(); // window
// 使用call调用函数
func.call(); // window
// 使用apply调用函数
func.apply(); // window
// 使用bind调用
let reason = func.bind() // 不会执行函数,但是会返回一个函数
reason(); // window
总结1:
call、apply 会直接调用函数,bind不会直接调用但会返回一个函数
2.call、apply、bind 来改变this指向
var name = '丽丽'
function func() {
console.log(this, this.name)
}
let person = {
name: '大丽'
}
// 正常调用
func(); // window, 丽丽
// 改变this指向
func.call(person); // person, 大丽
func.apply(person);// person, 大丽
let reason = func.bind(person);
reason()// person, 大丽
总结2:
call、apply、bind 都可以改变this的指向,如果不传,则默认为全局对象 window
3.call、apply、bind 传参
let animal = {
name: '安安',
sayName: function (p1, p2, p3) {
console.log(`我叫${this.name},我的主人叫${p1},她有时${p2},有时${p3}`)
}
}
let cat = {
name: '依安'
}
// 正常调用
animal.sayName('丽丽', '暴躁', '温柔'); // 我叫安安,我的主人叫丽丽,她有时暴躁,有时温柔
// 改变this指向,并传参
animal.sayName.call(cat, '丽丽', '暴躁', '温柔'); // 我叫依安,我的主人叫丽丽,她有时暴躁,有时温柔
animal.sayName.apply(cat, ['丽丽', '暴躁', '温柔']);// 我叫依安,我的主人叫丽丽,她有时暴躁,有时温柔
let reason = animal.sayName.bind(cat, '丽丽', '暴躁', '温柔');
reason()// 我叫依安,我的主人叫丽丽,她有时暴躁,有时温柔
总结3:
call、bind可接受N多个参数
- 第一个参数为this指向的对象
- 自第二个参数起,均为映射函数的参数
apply只能接受两个参数
- 第一个参数为this指向的对象
- 第二个参数为一个数组,数组的元素均为映射函数的参数