編程過程中,着實十分困擾this的指向性,經過查閱一番資料,終於搞清楚了,在這里總結一下,全文分為以下三個部分:
- 什么是this指針?
- this指針指向哪里?
- 何時使用this?
一 什么是this指針?
在JavaScript中,this指針是在創建函數時,由系統默認生成的兩個隱式參數之一(另一個是arguments)。
this指針指向與該函數調用進行隱式關聯的一個對象,該對象被稱為“函數上下文”。
要想成功的使用this,就必須搞清楚在不同情形下,this指針指向什么“函數上下文”,下面將總結this參數在不同狀況下的不同表現。
二 this指針指向哪里?
要搞清楚this指針的指向,需要根據不同的函數調用方式進行分析,有以下四種不同的調用情況:
(1)作為函數進行調用
這里作為函數進行調用是為了區分函數的其他調用方式(作為方法調用,new操作符調用和call,apply調用)。
函數通常通過()操作符進行調用,此時函數內的this指針指向的是window對象。
原因其實很好理解,默認this指針指向調用函數的對象,此時函數實際上是window對象的一個方法,因此this指針指向window對象是合情合理的。
但是,這里有一個不太好的地方需要特別注意:
var object = { way1 : function() { console.log(this); function innerFunc() { console.log(this); } innerFunc(); } } object.way1(); //object //window
innerFunc函數內的this指針在此時意外的指向了window對象,使用時應該記住這個差異。因為本質上這個函數依然作為滿足“作為函數進行調用”的條件。
(2)作為方法進行調用
一個方法所屬的對象在該方法體內可以以this的形式進行引用,因此,當一個函數以方法的形式被調用時,this指針指向該方法的所有者。
這是可以將JavaScript作為面向對象代碼進行編寫的主要手段之一。
(3)作為構造器進行調用
當函數作為“構造函數”進行調用時,this指針的指向解釋起來就略微復雜一點了。
我們要從構造函數本身來說起:
在JavaScript中,構造函數被用來構造對象:
function Person(name,age) { this.name = name; this.age = age; } var jenny = new Person('jenny',24); console.log(jenny.name); //jenny
構造函數的調用,返回值即為一個對象,而這個對象即為構造函數作用域內this指針的引用對象,即“函數上下文”。
(4)call(),apply()方法調用
除了上述的三種情況下造成this指針的引用對象差異外,我們還可以自定義this指針的指向,通過使用call(),apply()方法。
兩個方法的使用方式為:
function getName(age,sex) { console.log(this.name); this.age = age; this.sex = sex; } var jenny = { name : jenny }; getName.call(jenny,24,female); getName.apply(jenny,[24,female]); //jenny
可見這兩種調用方式的唯一區別在於,傳入參數的形式,call方法依次寫入參數,而apply方法則將所需傳入函數的參數打包為一個數組統一傳入。
而這兩種方法在做的事為,將函數內部的隱式this參數指向其第一個參數,並將其后的參數傳入至函數中,調用函數。
因此,在此種情況下,函數內部的this指針指向call與apply方法指定的對象。
以上是JavaScript中,this指針在四種情況下的引用對象。
三 何時使用this指針
未完待續。
