在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屬性('thisis a property of window' ),所以會彈出'thisis a property of window'。
上面的兩個範例都是比較容易理解的,因為只要判斷出當前函數是作為哪個物件的方法呼叫(被哪個物件呼叫)的,就可以很容易的判斷當前this變數的指向。
this.x 與apply()、call()
透過call和apply可以重新定義函數的執行環境,即this的指向,這對於一些應用當中是十分常用的。
範例三:call()
function changeStyle( type , value ){ this.style[ type ] = value; } var one = document.getElementByIdx( '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.getElementByIdx( 'one' ); changeStyle.apply( one , ['fontSize' , '100px' ]); changeStyle('fontSize' , '300px'); //出现错误,原因同示例三
apply的用法和call大致相同,只有一點區別,apply只接受兩個參數,第一個參數和call相同,第二個參數必須是數組,數組中的元素對應的就是函數的形參。
事件監聽函數中的this
var one = document.getElementByIdx( 'one' ); one.onclick = function(){ alert( this.innerHTML ); //this指向的是one元素,这点十分简单.. };
注意:js中的全域變數都會動態加入到Window 的實例 window,作為其屬性。
以上是this變數在javascript中是如何使用的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!