首頁 > web前端 > js教程 > 主體

JS中的this變數的簡單介紹

怪我咯
發布: 2017-07-07 15:04:51
原創
1124 人瀏覽過

JavaScript中this變數是一個令人難以摸清的關鍵字,this可謂是非常強大,在本文將為大家詳細介紹下JavaScript中this的使用,有興趣的朋友可以參考下方

JavaScript中this的使用

在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 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.getElementByIdx( 'one' ); 

one.onclick = function(){ 

alert( this.innerHTML ); //this指向的是one元素,这点十分简单.. 

};
登入後複製

注意:js中的全域變數都會動態加入到Window 的實例window,作為其屬性。

this是js的一個關鍵字,隨著函數使用場合不同,this的值會改變。但是總有一個原則,那就是this指的是呼叫函數的那個物件。

1、純粹函數呼叫。

 程式碼如下:

function test() { 
this.x = 1; 
alert(x); 
} 
test();
登入後複製

其實這裡的this就是全域變數。看下面的例子就能很好的理解其實this就是全域物件Global。

程式碼如下:

var x = 1; 
function test() { 
alert(this.x); 
} 
test();//1 

var x = 1; 
function test() { 
this.x = 0; 
} 
test(); 
alert(x);//0
登入後複製

2、作為方法調用,那麼this就是指這個上級物件。

程式碼如下:

function test() { 
alert(this.x); 
} 

var o = {}; 
o.x = 1; 
o.m = test; 
o.m(); //1
登入後複製


3、以建構子呼叫。所謂建構函數,就是生成一個新的物件。這時,這個this就是指這個物件。

程式碼如下:

function test() { 
this.x = 1; 
} 
var o = new test(); 
alert(o.x);//1
登入後複製


4、apply呼叫

this指向的是apply中的第一個參數。

 程式碼如下:

var x = 0; 
function test() { 
alert(this.x); 
} 

var o = {}; 
o.x = 1; 
o.m = test; 
o.m.apply(); //0 
o.m.apply(o);//1
登入後複製


當apply沒有參數時,表示為全域物件。所以值為0。

以上是JS中的this變數的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!