使用场景:
var name='全局张',age=18;
var person={
name:'对象张',
objAge:this.age,
logPerson(){
console.log(this.name+'的年龄是'+this.age);
}
}
//调用
person.objAge;//18
person.logPerson();//对象张的年龄是undefined
可见对象person的logPerson()中的this是指向Object的,此时如果想在logPerson()中使this指向window则需要使用call()/apply()/bind()。
不带参数用法
person.logPerson.call(this);//全局张的年级是18
person.logPerson.apply(this);//全局张的年级是18
person.logPerson.bind(this)();//全局张的年级是18
这里的this即window指向全局,this处用window是同样效果,bind(this)返回的是个函数,后需加()调用函数。
带参数用法
var name='全局张',age=18;
var person={
name:'对象张',
objAge:this.age,
logPerson(param1,param2){
console.log(this.name+'的年龄是'+this.age+' 老家'+param1+' 现居'+param2);
}
}
person.logPerson.call(this,'东北','南京');//全局张的年龄是18 老家东北 现居南京
person.logPerson.call(this,['东北','南京']);//全局张的年龄是18 老家东北,南京 现居undefined
person.logPerson.call(this,['东北','南京'],['1','2']);//全局张的年龄是18 老家东北,南京 现居1,2
person.logPerson.apply(this,['东北','南京']);//全局张的年龄是18 老家东北 现居南京
person.logPerson.apply(this,['东北'],['1','2']);//全局张的年龄是18 老家东北 现居undefined
person.logPerson.apply(this,[['东北','南京'],['1','2']]);//全局张的年龄是18 老家东北,南京 现居1,2
person.logPerson.bind(this,'东北','南京')();//全局张的年龄是18 老家东北 现居南京
person.logPerson.bind(this,['东北','南京'])();//全局张的年龄是18 老家东北,南京 现居undefined
person.logPerson.bind(this,['东北','南京'],['1','2'])();//全局张的年龄是18 老家东北,南京 现居1,2
可见call和bind为按项传参,传参的类型不限,可以是数组、字符串、数字、对象、函数等;apply传参只能取数组,如果有两个单项数组,只取第一个。