深入理解JavaScript中的this關鍵字

來源:互聯網
上載者:User

在JavaScript中this變數是一個令人難以摸清的關鍵字,this可謂是非常強大,充分瞭解this的相關知識有助於我們在編寫物件導向的JavaScript程式時能夠遊刃有餘。

對於this變數最要的是能夠理清this所引用的對象到底是哪一個,也許很多資料上都有自己的解釋,但有些概念講的偏繁雜。而我的理解是:首先分析this所在的函數是當做哪個對象的方法調用的,則該對象就是this所引用的對象。

樣本一、

 

var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //彈出 100

這段代碼非常容易理解,當執行 obj.y() 時,函數是作為對象obj的方法調用的,因此函數體內的this指向的是obj對象,所以會彈出100。

樣本二、

 

代碼

var checkThis = function(){
alert( this.x);
};
var x = 'this is a property of window';

var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };

obj.y(); //彈出 100
checkThis(); //彈出 'this is a property of window'

 

這裡為什麼會彈出 'this is a property of window',可能有些讓人迷惑。在JavaScript的變數範圍裡有一條規則“全域變數都是window對象的屬性”。當執行 checkThis() 時相當於 window.checkThis(),因此,此時checkThis函數體內的this關鍵字的指向變成了window對象,而又因為window對象又一個x屬性( 'this is a property of window'),所以會彈出 'this is a property of window'。

上面的兩個樣本都是比較容易理解的,因為只要判斷出當前函數是作為哪個對象的方法調用(被哪個對象調用)的,就可以很容易的判斷出當前this變數的指向。

 

this.x 與 apply()、call()

通過call和apply可以重新定義函數的執行環境,即this的指向,這對於一些應用當中是十分常用的。

樣本三:call()

代碼

function changeStyle( type , value ){
this.style[ type ] = value;
}

var one = document.getElementById( 'one' );

changeStyle.call( one , 'fontSize' , '100px' );

changeStyle('fontSize' , '300px'); //出現錯誤,因為此時changeStyle中this引用的是window對象,而window並無style屬性。

注意changeStyle.call() 中有三個參數,第一個參數用於指定該函數將被哪個對象所調用。這裡指定了one,也就意味著,changeStyle函數將被one調用,因此函數體內 this指向是one對象。而第二個和第三個參數對應的是changeStyle函數裡的type和value兩個形參。最總我們看到的效果是Dom元素 one的字型變成了20px。

樣本四:apply()

代碼

function changeStyle( type , value ){

this.style[ type ] = value;

}

var one = document.getElementById( 'one' );

changeStyle.apply( one , ['fontSize' , '100px' ]);

changeStyle('fontSize' , '300px'); //出現錯誤,原因同樣本三

apply的用法和call大致相同,只有一點區別,apply只接受兩個參數,第一個參數和call相同,第二個參數必須是一個數組,數組中的元素對應的就是函數的形參。

 

無意義(詭異)的this用處

樣本五:

代碼

var obj = {
x : 100,
y : function(){
setTimeout(
function(){ alert(this.x); } //這裡的this指向的是window對象,並不是我們期待的obj,所以會彈出undefined
, 2000);
}
};

obj.y();

如何達到預期的效果

var obj = {
x : 100,
y : function(){
var that = this;
setTimeout(
function(){ alert(that.x); }
, 2000);
}
};

obj.y(); //彈出100

事件監聽函數中的this

var one = document.getElementById( 'one' );
one.onclick = function(){
alert( this.innerHTML ); //this指向的是one元素,這點十分簡單..
};

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.