我们想看两个例子:
var name = "阿清",
age = 18;
var obj = {
name: "阿广",
objAge: this.age,
myFun: function() {
console.log(this.name + "年龄是" + this.age);
}
}
console.log(obj.objAge); //18
obj.myFun(); //阿广年龄是undefined
var a = "小明";
function showname() {
console.log(this.a);
}
showname(); //小明
由这两个例子可以看出来,第一个this指向obj,第二个例子this指向window。
我们要知道 call()、apply()、bind() 都是对this的重定向。改变调用函数体内的 this 指向。
如下:
var name = "阿清",
age = 18;
var obj = {
name: "阿广",
objAge: this.age,
myFun: function() {
console.log(this.name + "年龄是" + this.age);
}
}
var a = {
name: "小明",
age: 20
}
obj.myFun.call(a); //小明年龄是20
obj.myFun.apply(a); //小明年龄是20
obj.myFun.bind(a)(); //小明年龄是20
this 都指向的 a ,除了bind方法后面多了一个(),其他都一样,因为bind返回是一个新的函数,我们必须调用它,才会执行。
call()、apply()、bind() 也可以进行传参:
var name = "阿清",
age = 18;
var obj = {
name: "阿广",
objAge: this.age,
myFun: function(from, place) {
console.log(this.name + "年龄是" + this.age + " ,他的家乡是:" + from + place + "区");
}
}
var a = {
name: "小明",
age: 20
}
obj.myFun.call(a, "开封市", "祥符"); //小明年龄是20 ,他的家乡是:开封市祥符区
obj.myFun.apply(a, ["开封市", "祥符"]); //小明年龄是20 ,他的家乡是:开封市祥符区
obj.myFun.bind(a, "开封市", "祥符")(); //小明年龄是20 ,他的家乡是:开封市祥符区
obj.myFun.bind(a, ["开封市", "祥符"])(); //小明年龄是20 ,他的家乡是:开封市,祥符undefined区
我们可以看出
- call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数就有区别了。
- call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面。
- apply的参数必须放到一个数组里面才能传进去。
- bind 除了返回是一个函数之外,其他都是call 相同。
- 参数可以为String类型,函数类型,Object类型等等各种类型。
愿你的坚持终有收获。