this的指向:
es5 中寓落,this 的指向并不是在創(chuàng)建的時候就可以確定的炊豪, this 永遠指向最后調(diào)用它的那個對象溶诞。
var name = "windowsName";
function a() {
var name = "Cherry";
console.log(this.name); // windowsName
console.log("inner:" + this); // inner: Window
}
a();
注:這里的 a()鸯檬,就相當(dāng)于 window.a();所以最后 this 的指向始終是 window 對象螺垢。
var name = "windowsName";
var a = {
name: "Cherry",
fn : function () {
console.log(this.name); // Cherry
}
}
a.fn();
注:在這個例子中喧务,函數(shù) fn 是對象 a 調(diào)用的,所以打印的值就是 a 中的 name 的值甩苛。
var name = "windowsName";
var a = {
name: "Cherry", // 如果這里注釋掉蹂楣,this.name 就會返回 undefined。
fn : function () {
console.log(this.name); // Cherry
}
}
window.a.fn();
注:this 永遠指向最后調(diào)用它的那個對象讯蒲,所以這里 this 仍然指向 a 對象痊土。
var name = "windowsName";
var a = {
name : null,
// name: "Cherry",
fn : function () {
console.log(this.name); // windowsName
}
}
var f = a.fn;
f();
注:fn 雖然被賦值給 a 對象了, 但是并沒有被調(diào)用墨林, 最后仍然是被 window 調(diào)用的赁酝。所以 this 指向的也就是 window。
怎么改變 this 的指向:
- 使用箭頭函數(shù)旭等。
- 在函數(shù)內(nèi)部使用_this = this酌呆。
- 使用 apply、call搔耕、bind隙袁。
- new 實例化一個對象。
var name = "windowsName";
var a = {
name : "Cherry",
func1: function () {
console.log(this.name)
},
func2: function () {
setTimeout( function () {
this.func1()
},100);
}
};
a.func2() // this.func1 is not a function
注:因為這里的 setTimeout() 函數(shù)內(nèi)弃榨,this 指向的是 window菩收,而 window 對象是不包含 func1。
箭頭函數(shù)的 this
箭頭函數(shù)的 this 始終指向函數(shù)定義時的 this鲸睛,而非執(zhí)行時娜饵。箭頭函數(shù)需要記著這句話:“箭頭函數(shù)中沒有 this 綁定,必須通過查找作用域鏈來決定其值官辈,如果箭頭函數(shù)被非箭頭函數(shù)包含箱舞,則 this 綁定的是最近一層非箭頭函數(shù)的 this遍坟,否則,this 為 undefined”晴股。
var name = "windowsName";
var a = {
name : "Cherry",
func1: function () {
console.log(this.name)
},
func2: function () {
setTimeout( () => {
this.func1()
},100);
}
};
a.func2() // Cherry
注:這里的箭頭函數(shù)內(nèi)的 this 的始終是 a 對象愿伴,所以不會報錯。
在函數(shù)內(nèi)部使用 _this = this
var name = "windowsName";
var a = {
name : "Cherry",
func1: function () {
console.log(this.name)
},
func2: function () {
var _this = this;
setTimeout( function() {
_this.func1()
},100);
}
};
a.func2() // Cherry
注:這里將 this 提前保存在 _this 里面了电湘,所以 this 始終指向 a 對象公般。