Skip to content
On this page

优先级

隐式绑定 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

显然,显示绑定的优先级更高

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

可以看到,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

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

沪ICP备20006251号-1