深入理解javscript(10) this

2021-07-23 05:44:41 字數 1968 閱讀 2831

參考:

接著上一節講的話,應該輪到「執行上下文棧」了,但是這裡不得不插入一節,把this說一下。因為this很重要,js的面試題如果不出幾個與this有關的,那出題者都不合格。

其實,this的取值,分四種情況。我們來挨個看一下。

在此再強調一遍乙個非常重要的知識點:在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了。因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。

情況1:建構函式

所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件,而有些函式則不是。另外注意,建構函式的函式名第乙個字母大寫(規則約定)。例如:object、array、function等。

以上**中,如果函式作為建構函式用,那麼其中的this就代表它即將new出來的物件。

注意,以上僅限new foo()的情況,即foo函式作為建構函式的情況。如果直接呼叫foo函式,而不是new foo(),情況就大不一樣了。

這種情況下this是window,我們後文中會說到。

情況2:函式作為物件的乙個屬性

如果函式作為物件的乙個屬性時,並且作為物件的乙個屬性被呼叫時,函式中的this指向該物件。

以上**中,fn不僅作為乙個物件的乙個屬性,而且的確是作為物件的乙個屬性被呼叫。結果this就是obj物件。

注意,如果fn函式不作為obj的乙個屬性被呼叫,會是什麼結果呢?

如上**,如果fn函式被賦值到了另乙個變數中,並沒有作為obj的乙個屬性被呼叫,那麼this的值就是window,this.x為undefined。

情況4:全域性 & 呼叫普通函式

在全域性環境下,this永遠是window,這個應該沒有非議。

普通函式在呼叫時,其中的this也都是window。

以上**很好理解。

不過下面的情況你需要注意一下:

函式f雖然是在obj.fn內部定義的,但是它仍然是乙個普通的函式,this仍然指向window。

完了。看到了吧,this有關的知識點還是挺多的,不僅多而且非常重要。

最後,既然提到了this,有必要把乙個非常經典的案例介紹給大家,又是jquery原始碼的。

以上**是從jquery中摘除來的部分**。jquery.extend和jquery.fn.extend都指向了同乙個函式,但是當執行時,函式中的this是不一樣的。

執行jquery.extend(…)時,this指向jquery;執行jquery.fn.extend(…)時,this指向jquery.fn。

這樣就巧妙的將一段**同時共享給兩個功能使用,更加符合設計原則。

好了,聊完了this。接著上一節繼續說「執行上下文棧」。

注意:還有一部分this的內容本文中沒有講到,已經補充到這裡:

深入理解公式 1,0 的用法

一 從右往走進行vlookup 查詢kt002叫什麼名字 公式 vlookup kt002 if h 7 h 10,g 7 g 10 2,false 公式解釋 二 多條件查詢 根據 郭靖男 查詢出對應的年齡 公式 vlookup 郭靖男 if g7 g10 i7 i10,j7 j10 2,false...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...