箭頭函數裏this理解
阿新 • • 發佈:2019-01-06
作用域 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理解