JavaScript中的this關鍵字

在JavaScript中this變量是一個使人難以摸清的關鍵字,this可謂是很是強大,充分了解this的相關知識有助於咱們在編寫面向對象的JavaScript程序時可以遊刃有餘。html

1. 通常用處

對於this變量最要的是可以理清this所引用的對象究竟是哪個,也許不少資料上都有本身的解釋,但有些概念講的偏繁雜。而個人理解是:首先分析this所在的函數是當作哪一個對象的方法調用的,則該對象就是this所引用的對象。數組

示例一

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

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

示例二

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 ); };

var obj2 = oby.y;

obj.y();   //彈出 100
checkThis();    //彈出 'this is a property of window
obj2();    //彈出 '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變量的指向。字體

2. this.x 與 apply()、call()

經過call和apply能夠從新定義函數的執行環境,即this的指向,這對於一些應用當中是十分經常使用的。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。url

示例四: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相同,第二個參數必須是一個數組,數組中的元素對應的就是函數的形參。spa

3. 無心義(詭異)的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

4. 事件監聽函數中的this

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

5. 總結

以上能夠概括爲:「this所指的就是直至包含this指針的上層對象」code

調用形式 this指向
普通函數 全局對象window
對象的方法 該對象
構造函數 新構造的對象


  

最後還有個問題,就是var divs = this.$$(it, 'div');  這樣的用法,不知道誰知道是什麼意思

相關文章
相關標籤/搜索