大家好,我是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 : 何華颯
感謝 : 陳沖 | 趙銳泉 | 鄭明月| 楊綱
ppt鏈接:https://ptteng.github.io/PPT/PPT/js-02-targetOfKeywordThis.html
視頻鏈接:https://v.qq.com/x/page/p05308vzeqt.html
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
------------------------------------------------------------------------------------------------------------------------
技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷?!薄?/p>
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導??靵砼c我一起學習吧?!