爲啥用this
由於自己比較菜,對爲啥要用this的理解就是方便、簡潔,可以隱式的傳遞一個對象的引用,讓代碼邏輯簡潔,方便。
this的指向問題
誤解一:this指向函數自身
var a = 1
function test() {
var a = 2
console.log(this.a)
}
test()
// 1
如果this指向函數自身,那麼應該輸出2
誤解二:this指向函數
var a = 1
function test () {
var a = 2
fun()
}
function fun() {
console.log(this.a)
}
test()
// 1
如果this可以指向函數,那麼應該輸出2
this到底指向哪?
首先要知道到this是函數裏自帶的一個特殊對象,this的指向是在函數執行時所確定的,this既不指向函數自身,也不指向函數。函數在哪調用,this指向哪。看個栗子
var a = 1
function fun () {
console.log(this.a)
}
fun()
// 1
這裏fun函數在全局調用,那麼fun的this就指向全局,也就是window對象。
var a = 2
obj = {
a: 1,
fun: fun
}
function fun() {
console.log(this.a)
}
obj.fun()
// 1
上面栗子中,fun在obj中調用,fun中的this指向obj。
var a = 1
function fun () {
var a = 2
return fun1
}
function fun1() {
var a = 3
console.log(this.a)
}
fun()()
// 1
上面代碼中,先執行fun方法,返回fun1方法,接着執行fun1,fun1還是在全局環境中執行,所以,不管你怎麼引用或者返回,函數中的this就是那個對象調用函數,this就指向誰!!!
function test() {
console.log('test',this)
function fn() {
console.log('fn', this)
}
fn()
}
let obj = {
test: test
}
obj.test()
// tset: obj
// fn: window
上面代碼,test()作爲obj的一個屬性被obj調用,this指向obj,fn在test()中執行,沒人調用它,那他的this就tm指向window。