我們來談談this的理解。
上一章,我們講到arguments的類數組的對象,有兩個屬性。一個是callee和另一個是this的屬性。我們常用的是this屬性。所以,我們了解到this的屬性是屬于arguments對象的屬性。這兩個屬性都是指針。
this引用的是函數執行的環境對象。或者也可以說是this值。this是一個指針,指向調用執行的函數環境對象,也就是,誰調用this所在的當前函數時,this就指向這個對象。由于在調用函數之前,this的值并不確定。由于this引用的函數執行環境對象,所以,this的值是函數的執行對象。所以,我們要掌握好this的要點,要做到以下幾點:
第一:this只能存在于函數體當中,必須要有函數執行對象的環境。
第二:要分清this所在的函數,這個就是函數執行的對象,(this的指針作用就是當莫個對象調用函數執行的時指向他,而this在當前所在的函數體的所點屬性和方法就會用添加到這個對象,由這個對象來調用)。
第三:在創建對象時,我們經常用構造函數來創建對象。我們將創建的對象的屬性和方法都掛載在this指針上,將來this指向誰,就把掛載的屬性和方法添加在誰身上。在調用構造函數時,我們用new 關鍵字+構造函數名 為什么用new呢?因為new首先在內存中來在堆區開辟空間,然后構造函數this指針指向的這塊空間,掛載在this的屬性和方法就添加到這塊空間了,最后儲存的空間的地址保存在構造函數的實例了。(也可以這說,this指針所掛載的屬性和方法是添加到調用this指針所在當前函數的對象里。) 當在構造函數時添加return +引用類型的對象時,會覆蓋構造函數所創建的對象,即是new開辟的空間。除null之外。但當對象的方法交給新的變量時,再用新變量加小括號的形式去調用的話,this的指針就指向了window了。
第四:當網頁加載時,全局作用域中調用函數時,this指針指向的是window 對象。在調用this所在的當前函數之前,this的值并不確定,可能會在代碼執行當中引用不同的對象。主要是看誰來調用this所在的函數執行環境的對象。
第五:在事件的處理函數中,如果有this指針,是事件調用的觸發的,就指向綁定事件的標簽。但是,復雜的話,就是事件里面嵌套函數的情況。我們知道this的指針是指向調用this所在當前函數的對象。專業的講的話,是引用函數執行環境的對象。所以,我們要知道兩點:
1:this指針是指向的對象,它是作為引用函數執行環境對象的。(這也是我們經常看到是this點的是函數(方法)或者是屬性。)
2:定義this的環境可以是任意的環境和作用域,但是我們看的是誰調用執行this指針來執行,this就指向誰。
第六:在定時器中,由定時器調用并觸發的this指針的話,this指針就指向是window 。因為是定時器(setInterval setTimeout)是在第二個參數 時間 由window來驅動定時器執行,this 在執行語句中 就是指向的是window ?還有一種情況是定時器的參數,因為定時器的參數是一個函數,所以可以用this點方法來寫進參數,所以this的作用是指向傳參的對象,看傳參的環境,來辨別this的指向的對象。在全局的作用域的是window的傳參,在局部的作用域下是當前對象的傳參。
第七:在事件函數中,嵌套了函數,該函數又出現了this指針,那么this指針指向的是window。因為在嵌套的函數是在window驅動的。當我們要改變其this指針的指向時,我們可以通過用cell()和apply()來代替window來指向。就可以來改變其this指針的指向,來改變其操作。