四种绑定规则
1、默认绑定:window,独立调用也指向window
2、隐式绑定:对象调用,obj.foo();谁调用就指向谁(会出现隐式丢失)
3、显示绑定:call,apply,bind
4、new绑定规则
详解:JavaScript中this的指向_q12as的博客-CSDN博客
优先级
默认绑定默认指向的window,而显示绑定还是隐式绑定都是改变this的指向,如果默认绑定的优先级大,则使用隐式绑定和显示绑定无法改变this的指向,所以默认绑定的优先级是最低的。
比较隐式绑定和显示绑定
function foo(){
console.log(this.a);
}
var obj1={
a:1,
foo:foo
}
var obj2={
a:2,
foo:foo
}
obj1.foo();//1
obj2.foo();//2
obj1.foo.call(obj2);//2
obj2.foo.call(obj1);//1
显然输出的结果调换了,通过结果显示,显示绑定的优先级大于隐式绑定的优先级。显示是通过call,apply,bind来更改this的指向,如果人为主动的更改this的指向都没有作用,那显示绑定就失去了作用,所以显示绑定的优先级大于隐式绑定。
比较new绑定和显示绑定
function foo(b){
this.a=b;
}
var obj1={}
var bar = foo.bind(obj1);//返回一个新的函数
bar(2);
//通过bind将foo的this指向改为obj1,即foo里面的this.a=obj1.a
//通过bar(2)赋值,那么此时的obj1.a=2
console.log(obj1.a);//2
//通过new更改当前的this指向,指向为baz
//重新赋值3,但是此时的this指向为baz,和原本的obj1没有任何关系
var baz=new bar(3);
console.log(obj1.a);//2
console.log(baz.a);//3
那么此时的就存在this指向的问题,如果此时this指向obj1的话,那么通过baz重新赋值,obj1.a就会被覆盖,那么obj1.a就会等于3。如果this指向为baz,那么baz的指向上就会有一个属性为3.通过结果能够清晰的看见结果。所以new绑定的优先级大于显示绑定。