定义一个函数,我们采用三种不同的方式对它进行调用,它产生了三种不同的结果
//普通函数
function fun1() {
console.log(this);
}
fun1() //this指向window
//对象调用
let obj = {
name:'xiaoming',
fun:fun1
}
obj.fun() //this指向obj
fun1.call('aaa') //String {'aaa'}
改变this指向
let age = 66
let person = {
age:33,
sayAge:function(){
return `my age is ${this.age}`
}
}
let person2 = {
age:88,
}
console.log(person.sayAge()); //hhh==33
我们不想重复声明sayAge方法,而想做到一样的效果要怎么做呢?
可以通过call和apply可以改变this指向,在person2并上没有sayAge方法,但是通过改变this指向,并传递该方法所需要的属性,
就可以调用sayAge方法并达到我们的目的
call和apply都传递两个参数,第一个是要绑定的对象,第二个参数是要传递的属性,call是,分割的参数,apply参数是[]形式
bind和apply传参是一样的,但是要在后面加()调用方法
console.log(person.sayAge.call(person2,age)); //88
console.log(person.sayAge.apply(person2,[age])); //88
console.log(person.sayAge.bind(person2,[age])()); //88