JavaScript中this的四种绑定规则的优先级

四种绑定规则

        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绑定的优先级大于显示绑定。

优先级:new绑定>显示绑定>隐式绑定>默认绑定

Guess you like

Origin blog.csdn.net/q12as/article/details/120763012