強調(diào)點:
this在任何情況下都不指向函數(shù)的詞法作用域虏束;
this的指向是在函數(shù)調(diào)用時確定的而不是在函數(shù)聲明時確定的
this綁定規(guī)則(優(yōu)先級由低到高)
1显拜、默認綁定
函數(shù)調(diào)用類型: 獨立函數(shù)調(diào)用
function foo() {
console.log(this);
}
foo(); // global window...
2锯蛀、隱式綁定
函數(shù)調(diào)用類型:obj.foo()
function foo() {
console.log(this);
}
var obj = {
foo: foo
}
obj.foo();
但是在隱式綁定中存在著隱式丟失綁定對象的情況
一種情況
function foo() {console.log(this);}
var obj = {foo: foo}
var bar = obj.foo // 函數(shù)別名
bar() //調(diào)用位置在全局作用域下价说,為默認綁定
另一種情況:函數(shù)作為參數(shù)傳入時
function foo() {console.log(this);}
function doFoo(fn) {
// fn其實引用的是foo
fn(); // <--調(diào)用位置
}
var obj ={foo: foo}
doFoo(obj.foo);
3、顯式綁定
call蛾狗、apply、bind
4仪媒、new 綁定
var p = new Person();
var obj = {}; // 創(chuàng)建一個全新的對象
obj.__proto__ = Person.prototype; // 這個新對象會被執(zhí)行[[prototype]]連接
Person.call(obj); // 這個新對象會綁定到函數(shù)的this
return obj; // 返回這個新對象