this永遠指向最終調用的函數所在的對象數組
① this指向的,永遠只多是對象!bash
② this指向誰,永遠不取決於this寫在哪!而是取決於函數在哪調用。app
③ this指向的對象,咱們稱之爲函數的上下文context,也叫函數的調用者。函數
function Obj () {
console.log(this)
}
Obj() // window
複製代碼
function Obj () {
console.log(this)
}
let obj = {
name: 'hello',
where: Obj
}
obj.where() // {name: "hello", where: ƒ}
複製代碼
function Obj () {
console.log(this)
}
let obj = new Obj() // Obj{}
複製代碼
function Obj () {
setTimeout(function () {
console.log(this)
}, 100)
}
let obj = {
name: 'hello',
where: Obj
}
obj.where() // window
複製代碼
爲什麼在setTimeout和setInterval中this永遠指向window呢?下面專門瞭解一下ui
由setTimeout()調用的代碼運行在與所在函數徹底分離的執行環境上。這會致使,這些代碼中包含的 this 關鍵字在非嚴格模式會指向 window (或全局)對象,嚴格模式下爲 undefinedthis
function Obj () {
this.checkThis = function () {
console.log(this)
},
this.checkThisLast = function () {
setTimeout(function() {
console.log(this)
},100)
}
}
let obj = new Obj()
obj.checkThis() // Obj{}
obj.checkThisLast() // window
複製代碼
如何解決setTimeout和setInterval中this的指向問題呢?spa
function Obj () {
let self = this, // this綁定給一個變量
this.checkThis = function () {
console.log(this)
},
this.checkThisLast = function () {
setTimeout(function() {
console.log(self)
},100)
}
}
let obj = new Obj()
obj.checkThis() // Obj{}
obj.checkThisLast() // Obj{}
複製代碼
箭頭函數不會建立本身的this,它只會從本身的做用域鏈的上一層繼承thiscode
function Obj () {
this.checkThis = function () {
console.log(this)
},
this.checkThisLast = function () {
setTimeout(() => {
console.log(this)
},100)
}
}
let obj = new Obj()
obj.checkThis() // obj{}
obj.checkThisLast() // obj{}
複製代碼
bind()用法是將函數綁定到對象上,會建立新的函數,函數體內的this值會被綁定到傳入bind()的首個參數;f.bind(obj)至關於obj.f(),則f()的this指向obj對象
function Obj () {
this.checkThis = function () {
console.log(this)
},
this.checkThisLast = function () {
setTimeout(function () {
console.log(this)
}.bind(this),100)
}
}
let obj = new Obj()
obj.checkThis() // obj{}
obj.checkThisLast() // obj{}
複製代碼