请看实例代码
var person = {
name: "CoderXZ",
age: 26,
showInfo: function() {
console.log("I am " + this.name + "," + this.age + " years old!");
},
showDetailInfo: function(province, city) {
console.log("I am " + this.name + "," + this.age + " years old!" + "from " + city + " city," + province + " province!");
}
}
var person2 = {
name: "CoderXXXX",
age: 18
}
//不带参数
person.showInfo();
console.log("-------call-------");
person.showInfo.call(person2);
console.log("-------apply-------");
person.showInfo.apply(person2);
console.log("-------bind-------");
//注意二者的区别
// bind获取的是一个新的函数,如果不加括号,那么他不会被调用!
person.showInfo.bind(person2); //没有()
person.showInfo.bind(person2)(); //有()
从上面的例子可以看出,这三者的作用相同,可以重定向this,从而可以使用属于另一个对象的方法。本例调用 person 的 showInfo 方法,并用于 person2。但是bind有点不一样,bind返回是一个函数,如果你用()去调用它,他是不会执行的。
结论1,call()、apply()、bind() 都是用来重定义 this 这个对象的!
再看看传参的情况,
var person = {
name: "CoderXZ",
age: 26,
showInfo: function() {
console.log("I am " + this.name + "," + this.age + " years old!");
},
showDetailInfo: function(province, city) {
console.log("I am " + this.name + "," + this.age + " years old!" + "from " + city + " city," + province + " province!");
}
}
var person2 = {
name: "CoderXXXX",
age: 18
}
person.showDetailInfo("Hubei", "Huanggang");
console.log("-------call parameter-------");
person.showDetailInfo.call(person2, "Guangdong", "Shenzhen");
console.log("-------apply parameter-------");
person.showDetailInfo.apply(person2, ["Hunan", "Changsha"]);
console.log("-------bind parameter-------");
//注意二者的区别
// bind获取的是一个新的函数,如果不加括号,那么他不会被调用!
person.showDetailInfo.bind(person2, "Zhejiang", "Hangzhou")(); //没有()
person.showDetailInfo.bind(person2)("Zhejiang", "Hangzhou"); //有()
微妙的差距!
从上面四个结果不难看出:
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 person.showDetailInfo(person2,参数1,参数2····)
apply 的所有参数都必须放在一个数组里面传进去 ,person.showDetailInfo(person2,[参数1,参数2····])
bind 除了返回是函数以外,它 的参数和 call 一样。
当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!
结论2,对比call 、bind 、 apply 传参方式,call与bind类似,都是直接用逗号隔开。apply略有不同,传参需要传一个数组。参数类型不限。