天天看點

JavaScript中setTimeout的作用域以及this指向問題

setTimeout是window對象下的一個方法,常見用法就是讓某個方法延遲執行,伴随着此方法的使用會帶來一個this指向的問題,以前都是聽說,今天終于實際遇到了。還是老規矩一般的先上一句JavaScript進階程式設計中的一句話:逾時調用的代碼都是在全局作用域中執行的,是以函數中的this的值在非嚴格模式下指向window對象,在嚴格模式下是undefined。接下來針對非嚴格模式下寫一下測試情況。

問題引出:

JavaScript中setTimeout的作用域以及this指向問題
JavaScript中setTimeout的作用域以及this指向問題

那麼問題來了,要輸出正确的myName的值要如何修改程式?

下面就伴随着測試結果一步一步的解決掉這個問題。首先,setTimeout方法接受兩個參數,第一個是要執行的代碼或者函數,第二個是延遲的時間。經過四種情況下的測試,setTimeout中所執行的函數中的this,永遠指向window,注意,此處說的是延遲執行函數中this永遠指向window。下面是四種不同代碼的測試結果

JavaScript中setTimeout的作用域以及this指向問題

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

JavaScript中setTimeout的作用域以及this指向問題

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

JavaScript中setTimeout的作用域以及this指向問題

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

JavaScript中setTimeout的作用域以及this指向問題

 應該可以得出結論了:setTimeout中的延遲執行函數中的this指向了window,必須要強調,是延遲執行函數中的this,因為,一般情況下是存在兩個this的,一個是setTimeout調用環境中的this,一個就是延遲執行函數中的this,這兩個this有時候是不同的,是以,繼續測試。

還是先上結論,setTimeout調用環境中的this指向是需要根據上下文來确定的,預設為window,延遲執行函數中的this就是指向window。至于前者,根據上下文确定this指向應該還是很清楚的,這裡隻測試一下函數作為方法調用和作為構造函數調用時候this的情況,上圖:

JavaScript中setTimeout的作用域以及this指向問題

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

JavaScript中setTimeout的作用域以及this指向問題

 上了代碼後就可以發現,構造函數調用之後this的指向就是新new出來的執行個體對象,而作為方法調用之後this的指向其外層對象,一般為window;搞清楚這些之後就應該進入正題了,應該解決開篇的問題啦。還是繼續上代碼:

JavaScript中setTimeout的作用域以及this指向問題

 上圖中的結果應該是想象之中的,上下文環境都是window,是以列印出來的都是in the window

JavaScript中setTimeout的作用域以及this指向問題

這個圖中的結果不曉得是不是想象之中的,但是确實就是這樣的,因為第二個裡邊有一個匿名函數,這就是兩段代碼最大銅的不同,隻要是函數,就會有它的作用域,把上述代碼寫成下邊這樣也許就很清楚了。

JavaScript中setTimeout的作用域以及this指向問題

 到此應該開篇的問題已經有了一些解決的思路了,想要輸出myName應該不是什麼難事了,最主要的問題根源就是在setTimeout執行過程中this的指向問題,直接上代碼和測試結果了。

JavaScript中setTimeout的作用域以及this指向問題
JavaScript中setTimeout的作用域以及this指向問題

更多内容可以微信掃描二維碼,一起學習前端知識

JavaScript中setTimeout的作用域以及this指向問題

繼續閱讀