你不知道的JS系列 ( 23 ) - this 绑定优先级

Posted Zina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你不知道的JS系列 ( 23 ) - this 绑定优先级相关的知识,希望对你有一定的参考价值。

我们首先来看下隐式绑定和显示绑定哪个优先级更高
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

这个例子可以看到,显示绑定优先级比隐式绑定更高。



现在我们需要搞清楚 new 绑定和隐式绑定的优先级谁高
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

这个例子可以看出 new 绑定比隐式绑定优先高,但是 new 绑定和显示绑定谁的优先级高呢?



new 和 apply/call 无法一起使用。但是隐式绑定中有 Funciton.prototype.bind();
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

new 修改了硬绑定调用 bar() 中的 this

 

总结:new > 显示绑定 > 隐式绑定 > 默认绑定

以上是关于你不知道的JS系列 ( 23 ) - this 绑定优先级的主要内容,如果未能解决你的问题,请参考以下文章

你不知道的JS系列 ( 19 ) - this 调用位置

你不知道的JS系列 ( 22 ) - this new 绑定

你不知道的JS来聊聊this

《你不知道的JS(中卷)》关于this

《你不知道的js》——this全面解析

《你不知道的JS(中卷)》this详解