1. 程式人生 > >箭頭函數裏this理解

箭頭函數裏this理解

作用域 asc light 指向 對象 pre 方便 fun timeout

先來看代碼:

var obj1={
	id:4,
	fn:function(){
		var f=() => {    
			console.log(this); //object,f()定義在obj1對象中,this就指向obj1,這就是箭頭函數this指向的關鍵
			setTimeout(function() {
				console.log(this);//window,非箭頭函數的情況下還是要看宿主對象是誰,如果沒有被對象調用,函數體中的this就綁定的window上
			});
		}
		f();
	}
}
obj1.fn();

  正如註釋說的那樣,可以描述出箭頭函數裏的this定義:

箭頭函數沒有自己的this, 它的this是繼承而來; 默認指向在定義它時所處的對象(宿主對象),而不是執行時的對象,

定義它的時候,可能環境是window; 箭頭函數可以方便地讓我們在 setTimeout ,setInterval中方便的使用this

上面的

var f=() => {    
			console.log(this); 
這一部分,箭頭函數定義在了obj1對象裏面,所以this指向obj1。


那麽我們再來改變一下代碼:

var obj1={
	id:4,
	fn:()=>{
		var f=() => {    
			console.log(this); 
			setTimeout(function() {
				console.log(this);
			});
		}
		f();
	}
}
obj1.fn();

  這裏,我們給obj1的fn屬性也改成了箭頭函數,那麽他又會輸出什麽呢?

沒錯,放到瀏覽器運行後,發現this都指向window對象。為什麽不是obj1呢?

不是說箭頭函數的this由定義的時候的作用域對象決定的嗎?

其實是這樣的,

var obj1={
	id:4,
	fn:()=>{
這裏面,obj1是{id:4,fn:()=>{}}這一整個的定義,而obj1是定義在整個代碼空間下,或者說window下。
所以this繼承自window!!


箭頭函數裏this理解