我们想看两个例子:

1
2
3
4
5
6
7
8
9
10
11
12
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
1
2
3
4
5
6
var a = "小明";

function showname() {
console.log(this.a);
}
showname(); //小明

由这两个例子可以看出来,第一个this指向obj,第二个例子this指向window


我们要知道 call()、apply()、bind() 都是对this的重定向。改变调用函数体内的 this 指向。

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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() 也可以进行传参:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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类型等等各种类型。



愿你的坚持终有收获。