js中的this問題

this

this的指向在函數定義的時候是肯定不了的,只有函數執行的時候才能肯定this到底指向誰,實際上css

this的最終指向的是那個調用它的對象(這裏其實並不徹底對,this的指向有時候會很微妙,得靠本身去慢慢體會)數組

只有方法在對象上,對象調用當前方法,指向當前對象app

function  fnThis(){
	let user='js';
	console.log(this.user)//undefined
	console.log(this)//global(window)
}
fnThis();
這裏爲何會輸出一個全局的對象?由於咱們申明的函數,在全局裏,如今執行這個函數
其實是全局在調用
let obj={
	user:'js',
	fn:function(){
		console.log(this.user)
	}
obj.fn();
這裏是obj在調用,因此指向咱們的obj,這並不能說明,咱們一開始就說的this最終調用他的那個
對象

let obj={
	user:'js',
	objTwo:{
		user:'css',
		fn:function(){
			console.log(this.user)
		}
	}
}
obj.objTwo.fn();
這裏只是指向了obj2,而並無指向最終調用它的obj.

來個料咋們看看this這傢伙函數

<button id="myBtn" value="按鈕">按鈕</button>
<script>

let myBtn=document.querySelector("#myBtn")
let fn=function(){
  console.log(this);
}
myBtn.onclick=function(){
  fn();//輸出的全局
  console.log(this);//輸出的是這個button
}
</script>

這裏從表面看,會認爲第一個輸出的是這個btn按鈕,不是說誰調用指向誰麼,可是咋們仔細看這個是btn在調用麼???

實際上是這個點擊事件的匿名函數在調用,而這fn()自己是全局上下文的函數,它的this指向的是全局,它是做爲這個匿名函數的普通函數,天然指向的全局this

咱們若是這樣寫spa

myBtn.onclick=fn;//btn點擊的時候就指向這個btn了,這時候輸出結果爲這個button,

總結

1. 全局上下文,或者普通函數上下文裏面的this,包括函數裏面的普通函數,都是指向全局
2. 在對象方法裏面的this指向該對象
3. 在事件方法裏面的this指向發生事件的這個對象

特殊狀況

let obj={
	user:'js',
	objTwo:{
		user:'css',
		fn:function(){
			console.log(this.user)
			console.log(this)
		}
	}
}

let objThre=obj.objTwo.fn;
objThree();
把函數賦值給了objThree,而objThree是在全局上,因此輸出的是全局

補充

let chinesePeople=function(){
		this.name='張飛';
		return obj
	}
 若是返回的是對象,this就指向返回的那個對象,不然就指向實例對象

改變的幾種方式

let obj={a:80}
let objTwo={
		a:70,
		fn:function(){
			console.log(this.a);
		}
}
objTwo.fn.call(obj);
調用一個方法,並改變其this指向
objTwo.fn.apply(obj);
調用一個方法,並改變其this指向

前2者區別,在於後面的參數,一個是順序,一個是數組

objTwo.fn.bind(obj)();		

bind()方法會建立一個新函數,在綁定後,咱們能夠加括號當即執行,也能夠等須要執行再執行
第一個參數對象,之後的順序傳參

new方法,實際上是隱藏的調用了一個call的方法
相關文章
相關標籤/搜索