1. 程式人生 > >JS中THIS的指向?

JS中THIS的指向?

這裡是修真院前端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】

八個方面深度解析前端知識/技能,本篇分享的是:

【 JS中THIS的指向?】

大家好,我是IT修真院北京分院第22期的學員楊綱,一枚正直純潔善良的WEB前端程式設計師。

1.背景介紹

this物件是在執行時基於函式的執行環境繫結的,在全域性函式中,this就是window,當函式被作為某個物件的方法呼叫時,this就是那個物件,匿名函式的執行具有全域性性,也就是說,匿名函式this指向window。

2.知識剖析

全域性環境中的this

functiontest(){console.log(this);                  }                  test();

總結:在全域性作用域中它的 this 執行當前的全域性物件(瀏覽器端是 Window,node 中是 global)

嚴格模式‘use strict’下的this

'use strict';functiontest(){console.log(this);                  };                                    test();// undefined

原因:this 並不會指向全域性,而是 undefined,這樣的做法是為了消除 js 中一些不嚴謹的行為

在javascritp中,不一定只有物件方法的上下文中才有this, 全域性函式呼叫和其他的幾種不同的上下文中也有this指代。 它可以是全域性物件、當前物件或者任意物件,這完全取決於函式的呼叫方式。JavaScript 中函式的呼叫有以下幾種方式:作為物件方法呼叫,作為函式呼叫,作為建構函式呼叫,和使用 apply 或 call 呼叫。

1.作為物件方法呼叫:this 被自然繫結到該物件,也就是說this就指這個上級物件

 

moveTo

2.作為函式呼叫:this被繫結到全域性物件成為一個值為 5 的全域性變數

 

3.作為建構函式呼叫:this 繫結到新建立的物件上,也就是說this就指這個新物件

 

注:建構函式不使用new呼叫,則和普通函式一樣。一般地,建構函式首字母大寫

4.使用 apply 或 call 呼叫:在 JavaScript 中函式也是物件,物件則有方法,apply 和 call 就是函式物件的方法。

3、常見問題1現象:兩次列印的this不一樣

 

 

問題二

 

現象:加了嚴格模式,foo 呼叫也沒有指定 this,應該是出來undefined,但是這裡仍然出現了全域性物件

4、解決方案

問題一可以這麼這麼解決:利用 閉包 的特性來處理

可以看到直接用 this 仍然是 Window;因為 foo2 中的 this 是指向 obj,我們可以先用一個變數 _this 來儲存,然後在回撥函式中使用 _this,就可以指向當前的這個物件了

但上面這個方法不太好,可以直接在setTimeout(this.foo, 1000);的基礎上改寫為

setTimeout(this.foo.apply(obj), 1000);,即可實現foo的this指向為obj。

6.擴充套件思考

問題:如何理解this?

當一個函式被呼叫時,擁有它的object會作為this傳入。在全域性下,就是window or global,其他時候就是相應的object。 也可以看到,call和apply就是利用這一點實現更改this 值的

7.參考文獻

參考一:深入淺出 JavaScript 中的 this

參考二:JavaScript 中的 this !

參考三:JavaScript中的this用法與指向

參考四:如何理解 JavaScript 中的 this 關鍵字?

課後討論:

問:函式被物件呼叫後再執行的函式中this為什麼會指向window?

答:有一種解釋是settimeout的特性,setTimeout 方法在呼叫傳入函式的時候,如果這個函式沒有指定了的 this,那麼它會做一個隱式的操作—-自動地注入全域性上下文,等同於呼叫 foo.apply(window) 而非 foo();

但是經過筆者親測,即使把settimeout換成自執行函式的情況,也會出現第二次的函式this指向window,所以這個問題的答案存疑。

問:下面程式碼中,apply的意義到底在哪裡?

答:我們都知道,this的學習的精華在於這一句:this物件是在執行時基於函式的執行環境繫結的,在全域性函式中,this就是window,當函式被作為某個物件的方法呼叫時,this就是那個物件,匿名函式的執行具有全域性性,也就是說,匿名函式this指向window。

apply的意義在於,當物件呼叫函式的時候,他可以強制指定函式指向。上面的apply()中如果是另外一個物件,辣麼這個o。m的this就會指向那個物件。

問:作為全域性函式呼叫時,如果生命全域性變數x=3,辣麼this。x=?

 

答:因為在函式內已經指定this。x=1.辣麼alertthis。x肯定還是1.

鳴謝

感謝大家觀看

BY : 何華颯

感謝 : 陳沖 | 趙銳泉 | 鄭明月| 楊綱

 

JS中THIS的指向_騰訊視訊

 

ppt連結:https://ptteng.github.io/PPT/PPT/js-02-targetOfKeywordThis.html

視訊連結:https://v.qq.com/x/page/p05308vzeqt.html

今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~

------------------------------------------------------------------------------------------------------------------------

技能樹.IT修真院

“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。

這裡是技能樹.IT修真院,成千上萬的師兄在這裡找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧 !

猛戳這裡



作者:古碑先生
連結:https://www.jianshu.com/p/da7811cb737b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

更多內容,可以加入IT交流群565734203與大家一起討論交流

這裡是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到網際網路的聚集地