Appearance
优先级
隐式绑定 VS 显式绑定
javascript
function foo() {
console.log(this.a);
}
var obj1 = {
a: 2,
foo: foo,
};
var obj2 = {
a: 3,
foo: foo,
};
obj1.foo(); // 2
obj2.foo(); // 3
obj1.foo.call(obj2); // 3
obj2.foo.call(obj1); // 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
显然,显示绑定的优先级更高
new 绑定 VS 隐式绑定
javascript
function foo(something) {
this.a = something;
}
var obj1 = {
foo: foo,
};
var obj2 = {};
obj1.foo(2);
console.log(obj1.a); // 2
obj1.foo.call(obj2, 3);
console.log(obj2.a); // 3
var bar = new obj1.foo(4);
console.log(obj1.a); // 2
console.log(bar.a); // 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
可以看到,new 绑定的优先级>隐式绑定
new 绑定 VS 显式绑定
因为 new 和 apply、call 无法一起使用,但硬绑定也是显式绑定的一种,可以替换测试
javascript
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind(obj1);
bar(2);
console.log(obj1.a); // 2
var baz = new bar(3);
console.log(obj1.a); // 2
console.log(baz.a); // 3
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
bar 被绑定到 obj1 上,但是 new bar(3) 并没有像我们预计的那样把 obj1.a 修改为 3。但是,new 修改了绑定调用 bar()中的 this
我们可认为 new 绑定优先级>显式绑定
综上,new 绑定优先级 > 显示绑定优先级 > 隐式绑定优先级 > 默认绑定优先级
相关链接
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this