js中call、apply和bind的异同点
js中的this指向是灵活多变的,有的时候我们需要改变this的指向,这个时候就要用到call()、apply()或者bind()方法。
1、call
先看看下面的例子:
let xiaoming = {
name:'xiaoming'
};
let lihua = {
name: 'lihua',
foo:function (){
console.log(this.name);
}
};
lihua.foo();//lihua
lihua.foo.call(xiaoming);//xiaoming
正常情况下,lihua.foo()中的this就是指向lihua,当我们使用了call()方法后,this的指向改变了,改成了xiaoming。
call()方法还可以传入参数:
let xiaoming = {
name:'xiaoming'
};
let lihua = {
name: 'lihua',
foo:function (age,sex){
console.log(this.name +' is a ' + age + "-year-old " +sex);
}
};
lihua.foo.call(xiaoming,15,'boy');//xiaoming is a 15-year-old boy
2、apply
apply()与call()用法基本一致,不同的是,call()传参数时,使用的是参数列表:call(obj,param1,param2…),而apply()传参数时候使用的是数组:apply(obj,array),例子如下:
let xiaoming = {
name:'xiaoming'
};
let lihua = {
name: 'lihua',
foo:function (age,sex){
console.log(this.name +' is a ' + age + "-year-old " +sex);
}
};
let arr = [15,'boy'];
lihua.foo.apply(xiaoming,arr);//xiaoming is a 15-year-old boy
lihua.foo.apply(xiaoming,[15,'boy']);//与上面等价
3、bind
bind()和call(),apply()的区别就比较明显了,call()和apply()是直接调用,而bind()则是返回一个函数:
let xiaoming = {
name:'xiaoming'
};
let lihua = {
name: 'lihua',
foo:function (age,sex){
console.log(this.name +' is a ' + age + "-year-old " +sex);
}
};
lihua.foo.bind(xiaoming,15,'boy');//函数没调用
lihua.foo.bind(xiaoming,15,'boy')();//xiaoming is a 15-year-old boy
由于bind()返回的是一个函数,所以可以在函数调用时传参:
let test = lihua.foo.bind(xiaoming);
test(15,'boy');//xiaoming is a 15-year-old boy
4、总结
1、call()、apply()和bind(),都可以用来改变this的指向。
2、它们三个的第一个参数都是this要指向的对象。
3、它们三个都能传参数,call()和bind()传的是参数列表,apply()传的是数组。
4、call()和apply()是直接调用,bind()返回的是函数,可以在后面需要时再调用,所以也可以在调用的时候再传入参数。