在JavaScript中this變量是一個使人難以摸清的關鍵字,this可謂是很是強大,充分了解this的相關知識有助於咱們在編寫面向對象的JavaScript程序時可以遊刃有餘。html
對於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變量的指向。字體
經過call和apply能夠從新定義函數的執行環境,即this的指向,這對於一些應用當中是十分經常使用的。this
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
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
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
var one = document.getElementById( 'one' ); one.onclick = function(){ alert( this.innerHTML ); //this指向的是one元素,這點十分簡單.. };
以上能夠概括爲:「this所指的就是直至包含this指針的上層對象」code
調用形式 | this指向 |
---|---|
普通函數 | 全局對象window |
對象的方法 | 該對象 |
構造函數 | 新構造的對象
|
最後還有個問題,就是var divs = this.$$(it, 'div'); 這樣的用法,不知道誰知道是什麼意思