JavaScript的this指針到底指向哪?


編程過程中,着實十分困擾this的指向性,經過查閱一番資料,終於搞清楚了,在這里總結一下,全文分為以下三個部分:

  1. 什么是this指針?
  2. this指針指向哪里?
  3. 何時使用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指針

未完待續。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM