文章出處

前面的話

  上一篇介紹過this的綁定規則,那如果在函數的調用位置上同時存在兩種以上的綁定規則應該怎么辦呢?本文將介紹this綁定的優先級

 

顯式綁定 pk 隱式綁定

  顯式綁定勝出

function foo() {
    console.log( this.a );
}
var obj1 = {
    a: 2,
    foo: foo
};
var obj2 = {
    a: 3,
    foo: foo
};
obj1.foo(); // 2
obj2.foo(); // 3
//在該語句中,顯式綁定call(obj2)和隱式綁定obj1.foo同時出現,最終結果為3,說明被綁定到了obj2中 obj1.foo.call( obj2 ); // 3 obj2.foo.call( obj1 ); // 2

 

new綁定 pk 隱式綁定

  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
//在下列代碼中,隱式綁定obj1.foo和new綁定同時出現。最終obj1.a結果是2,而bar.a結果是4,說明this被綁定在bar上
var bar = new obj1.foo( 4 );
console.log( obj1.a ); // 2
console.log( bar.a ); // 4

 

new綁定 pk 顯式綁定

  new綁定勝出

function foo(something) {
    this.a = something;
}
var obj1 = {};
//先將obj1綁定到foo函數中,此時this值為obj1
var bar = foo.bind( obj1 );
bar( 2 );
console.log(obj1.a); // 2
//通過new綁定,此時this值為baz
var baz = new bar( 3 );
console.log( obj1.a ); // 2
//說明使用new綁定時,在bar函數內,無論this指向obj1有沒有生效,最終this都指向新創建的對象baz
console.log( baz.a ); // 3

 

順序

  【1】是否是new綁定?如果是,this綁定的是新創建的對象

var bar = new foo();

  【2】是否是顯式綁定?如果是,this綁定的是指定的對象

var bar = foo.call(obj2);

  【3】是否是隱式綁定?如果是,this綁定的是屬于的對象

var bar = obj1.foo(); 

  【4】如果都不是,則使用默認綁定

var bar = foo();

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()