定义

call()、apply()、bind()这三者都是用来重新定义this这个对象的

从下面的代码中可以看出,默认obj.myFun()shows()中的this分别指向obj对象和Window对象。通过call()、apply()、bind()this指向了db

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var name = '小往', age = 17;
var obj = {
name: '小组',
objAge: this.age,
myFun: function () {
console.log(this);
//console.log(this.name + ';obj年龄:' + this.objAge + 'age 年龄:' + this.age);
}
}

function shows() {
console.log(this);
}

var db = {
name: '笑笑',
age: 22,
};

obj.myFun();
shows();

obj.myFun.call(db);
obj.myFun.apply(db);
obj.myFun.bind(db)();

// {name: "小组", objAge: 17, myFun: ƒ}name: "小组"objAge: 17myFun: ƒ ()__proto__: Object
// Window {parent: Window, opener: n ... ... ()__proto__: Window
// {name: "笑笑", age: 22}
// {name: "笑笑", age: 22}
// {name: "笑笑", age: 22}

三者区别

bind()方法返回的是一个新的函数,必须要调用它才会被执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var name = '小往', age = 17;
var obj = {
name: '小组',
objAge: this.age,
myFun: function () {
console.log(this.name + ';obj年龄:' + this.objAge + 'age 年龄:' + this.age);
}
}

var db = {
name: '笑笑',
age: 22,
};

obj.myFun.call(db);
obj.myFun.apply(db);
obj.myFun.bind(db)();

// 笑笑;obj年龄:undefinedage 年龄:22
// 笑笑;obj年龄:undefinedage 年龄:22
// 笑笑;obj年龄:undefinedage 年龄:22

call()、apply()、bind()三个函数的第一个参数都是this的指向对象,区别在于第二个参数,apply()需要传入一个数组,call()、bind()依次传入参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var name = '小往', age = 17;
var obj = {
name: '小组',
objAge: this.age,
myFun: function (from, to) {
console.log(this.name + ';obj年龄:' + this.objAge + 'age 年龄:' + this.age + ',' + from + '去往' + to);
}
}

var db = {
name: '笑笑',
age: 22,
};

obj.myFun.call(db, '杭州', '上海');
obj.myFun.apply(db, ['杭州', '上海']);
obj.myFun.bind(db, '杭州', '上海')();
obj.myFun.bind(db, ['杭州', '上海'])();
console.log(obj.name)

// 笑笑;obj年龄:undefinedage 年龄:22,杭州去往上海
// 笑笑;obj年龄:undefinedage 年龄:22,杭州去往上海
// 笑笑;obj年龄:undefinedage 年龄:22,杭州去往上海
// 笑笑;obj年龄:undefinedage 年龄:22,杭州,上海去往undefined
// 小组