call、bind、apply
call、bind、apply它们三个都是函数的方法,都可以用于改变this的指向问题。
var person = "liangxiao"
let obj = {
name:"张三",
say:function() {
console.log(this.name);
}
}
obj.say();
setTimeout(function() {
obj.say();
},1000)
obj.say()打印的"张三",但是settimeout打印的"liangxiao",是因为this的指向问题,在对象中this指向this的调用者,也就是obj这个对象,在settimeout中this指向window对象。
如果想要改变settimeout中的this指向obj对象,我们就要修改this的指向:
1. apply
var person = "liangxiao"
let obj = {
name:"张三",
say:function(param1,param2) {
console.log(this.name);
console.log(param1,param2);
}
}
obj.say();
setTimeout(function() {
obj.say.apply(obj,["hello","world"]);
},1000)
第一个参数放想要指向的对象,其余参数以数组的形式传递给函数。
2. call
var person = "liangxiao"
let obj = {
name:"张三",
say:function(param1,param2) {
console.log(this.name);
console.log(param1,param2);
}
}
obj.say();
setTimeout(function() {
obj.say.call(obj,"hello","world");
},1000)
call和apply只有一点区别,就是其余参数以单独的形式分隔开传递给函数,而不是以数组的形式。
3. bind
var person = "liangxiao"
let obj = {
name:"张三",
say:function(param1,param2) {
console.log(this.name);
console.log(param1,param2);
}
}
obj.say();
let newFun = obj.say.bind(obj,"hello","world");
newFun();
// let newFun = obj.say.bind(obj)
//newFun("hello","world")
bind方法和call、apply方法的区别是,它不会直接执行函数,而是返回一个新的函数,需要再调用新的函数。
还要注意的一个点就是并不需要一次性的将参数全部传递出去,而是可以放在返回的新函数的调用中传递。