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就指這個上級物件
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 關鍵字?
課後討論:
問:函式被物件呼叫後再執行的函式中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,初學者轉行到網際網路的聚集地