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

我们首先来看下隐式绑定和显示绑定哪个优先级更高

function foo(){  console.log(this.a)}var obj1 = {  a: 2,  foo: foo}var obj2 = {  a: 3,  foo: foo}obj1.foo(); // 2obj2.foo(); // 3obj1.foo.call(obj2); // 3obj2.foo.call(obj1); // 2

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

现在我们需要搞清楚 new 绑定和隐式绑定的优先级谁高

function foo(something) {  this.a = something}var obj1 = {  foo: foo}var obj2 = {}obj1.foo(2);console.log(obj1.a); // 2obj1.foo.call(obj2, 3);console.log(obj2.a); // 3var bar = new obj1.foo(4);console.log(obj1.a); // 2console.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); //2var baz = new bar(3);console.log(obj1.a); // 2console.log(baz.a); // 3

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

 

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

相关文章