一、call,apply,bind的共同点
它们三个第一个参数都可以改变函数的this指向,如果第一个参数传递null或undefined或不传,函数中的this将指向window
二、call,apply,bind的不同点
1.call改变this指向
用法:方法名.call(this的新指向,参数1,参数2,参数3…)
call的传参第一个是this的新指向,后面传的是参数列表。call使用后会自动执行函数。
示例如下:
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"Y",
lastName: "ST"
}
person.fullName.call(person1, "北京", "中国"); // 结果: ST Y,北京,中国
2.apply改变this指向
用法:方法名.apply(this的新指向,[参数数组])
apply的传参第一个是this的新指向,后面传的是参数数组。apply使用后会自动执行函数。
示例如下:
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"ST",
lastName: "Y"
}
person.fullName.apply(person1,["北京", "中国"]); // 结果: ST Y,北京,中国
3.bind改变this指向
用法:方法名.bind(this的新指向,参数1,参数2,参数3…)
bind的传参第一个是this的新指向,后面传的是参数列表。bind使用后会返回一个函数,并且返回后的函数的this无法再改变。
示例如下:
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"ST",
lastName: "Y"
}
var person2 = {
firstName:"Y",
lastName: "C"
}
var newFun = person.fullName.bind(person1,["北京", "中国"]);
newFun(); // 结果: ST Y,北京,中国
newFun.call(person2, "北京", "中国"); // 结果: ST Y,北京,中国
newFun.apply(person2,["北京", "中国"]); // 结果: ST Y,北京,中国
newFun.bind(person2,"北京", "中国")(); // 结果: ST Y,北京,中国
推荐学习:一篇文章搞懂this指向