導航:首頁 > 編程語言 > javascript中的this

javascript中的this

發布時間:2024-06-21 11:44:31

javascript 中的this如何判斷他是代表哪一個對象呢

一.This對象的概述
在javascript編程中,我們經常用到this關鍵字,但有時也經常被它搞得頭暈,下面將說明this的作用范圍與以及它所指代的對象。
This特指當前對象,所有通過this.attr賦予的屬性,都屬於當前對象;那當前對象是什麼呢,它的作用范圍又是什麼呢,在不同情況下,this對象的表現形式各不相同,下面就講講我對this對象的理解。

二.This所指代的對象

1. 對於javascript,它的編寫方式比較隨意,但擴展性很強,我們可以使用面向過程的編寫方式,也可以使用面向對象的編寫方式,在這兩種編寫方式下,this的表現形式是不同的,下面我們先看一下定義變數的一些方式。
下面我們看一個示例(這是一個面向過程的調用方式,先不急於看結果,你可以自己想一下執行結果該是什麼):
functiontest(){
var1=100;
varvar2=100;
this.var3=100;
f1=function(){}
varf2=function(){}
functionf3(){}
this.f4=function(){}
}
test();
alert(typeof var1);
alert(typeof var2);
alert(typeof var3);
alert(typeof f1);
alert(typeof f2);
alert(typeof f3);
alert(typeof f4);

//======以下是上面的執行結果======
1.number
2.undefined
3.number
4.function
5.undefined
6.undefined上面f2的寫法等價於f3的寫法
7.function
解析:我們可以把window看成一個大對象,它是Window對象的實例化,我們編寫的所有javascript代碼都包含在該對象內,因此,當前對象this特指window實例。
1. alert(typeof var1);//number
var1是一個未明確定義的變數,根據作用域范圍定義,該對象屬於window實例的對象,它的作用范圍為全局。
2. alert(typeof var2);//undefined
var2是一個明確定義枯核液的變數,根據作用域范圍定義,該對象的作用域范圍為函數級別,即test函數所屬范圍,因此不可訪問。
3. alert(typeof var3);
var3是以對象屬性的方式定義的,但是test調用的時候卻是氏手以過程的方式調用,也就是說test沒有被實例化成對象,並且test屬於window對象,那麼當前對象this仍然是window,所以var3屬性是屬於window的。
4. alert(typeof f1);
f1函數與var1變數同理
5. alert(typeof f2);
f2函數與var2變數同理
6. alert(typeof f3);
f3函數與var2變數同理
7. alert(typeof f4);
f4函數與var3變數同理
//===============================

下面是一個面向對象的調用示例:
functiontest(){
var1=100;
varvar2=100;
this.var3=100;
f1=function(){}
varf2=function(){}
functionf3(){}
this.f4=function(){}
}
t =newtest();
alert(typeof var1);
alert(typeof var2);
alert(typeof var3);
alert(typeof t.var3);
alert(typeof f1);
alert(typeof f2);
alert(typeof f3);
alert(typeof f4);
alert(typeof t.f4);
//======以下是上面的執行結果======
1. Number
2. Undefined
3. Undefined
4. Number
5.沒物 Function
6. Undefined
7. Undefined
8. Undefined
9. Function
解析:這次test是使用面向對象的方式調用的,下面我們看一下,為何執行結果會是如此:
1. alert(typeof var1);還是作用域的問題,未明確定義為全局變數
2. alert(typeof var2);明確定義,為函數級別變數
3. alert(typeof var3);
因為test當前是使用面向對象的方式調用的,那麼test對象中的當前對象為實例化的test,即this已經不是window對象了,而是test的實例化t
4. alert(typeof t.var3);
由上面解析可知,var3屬於對象t,那麼自然可以獲得此變數
5. alert(typeof f1);同理var1
6. alert(typeof f2);同理var2
7. alert(typeof f3);同理var2
8. alert(typeof f4);同理var3
9. alert(typeof t.f4);同理var3

三.This的操作與修改
上面我們了解了一下this指代的對象和作用范圍,但實際上this是可以被指定修改的,我們可以通過call,apply等函數指定當前函數的this對象,通常這些函數也用於繼承的實現。
如上面的函數通過call來調用指定this對象,將獲得完全不同的執行結果,以下我們通過call實現了javascript的繼承。
functionf1(){
this.age=27;
}
functiontest(){
f1.call(this);
this.address='地址';
}
t=newtest();
alert(t.age);
alert(t.address);

不是原創的,希望對你有幫助。

❷ javascript中setTimeout和clearTimeout和this這三個關鍵字的是什麼意思

(1)setTimeout()簡單抄的說就是過多少秒以後調用某個函數
(2)clearTimeout() 清除定時器
(3)this表示當前對象,在類里經常用到,如:
function myClass()
{
// 當前類的 name 屬性
this.name = "My Name is Class";
this.age = 20;
}
var oTest = new myClass;
// 這里就會顯示 myClass 類里的 name 屬性
alert(oTest.name);

另,如果在HTML標簽里使用this,則表示當前標簽,如:
<button name='btnTest' onclick="javascript:alert(this.name)">測試</button>
當我們單擊這個按鈕時,將彈出它的 name 屬性。

❸ JavaScript 關於this的賦值問題

this是JavaScript中功能最強大的關鍵字之一。不幸的是,如果你不知道它具體怎麼工作,你將很難正確使用它。

this是面向對象語言中的一個重要概念,在JAVA,C#等大型語言中,this固定指向運行時的當前對象。但是在javascript中,由於
javascript的動態性(解釋執行,當然也有簡單的預編譯過程),this的指向在運行時才確定。這個特性在給我們帶來迷惑的同時也帶來了編程上的
自由和靈活,結合apply(call)方法,可以使JS變得異常強大。
2.變化的this

在JavaScript中,this通常指向的是我們正在執行的函數本身,或者是指向該函數所屬的對象(運行時)。當我們在頁面中定義了函數
doSomething()的時候,它的owner是頁面,或者是JavaScript中的window對象(或
global對象)。對於一個onclick屬性,它為它所屬的HTML元素所擁有,this應該指向該HTML元素。
2.1在幾種常見場景中this的變化

函數示例
function doSomething ()
{
alert(this.navigator);
//appCodeName
this.value = "I am from the Object constructor";

this.style.backgroundColor = "# 000000";
}
1.
(A)作為普通函數直接調用時,this指向window對象.
2. (B)作為控制項事件觸發時
1) inline event
registration 內聯事件注冊 .將事件直接寫在HTML代碼中(<element

onclick=」doSomething()」>), 此時this指向 window對象 。
2) Traditional event
registration 傳統事件注冊 (DHTML方式).
形如 element.onclick = doSomething; 此時this指向
element對象
3) <element onclick=」doSomething(this)」>作為參數傳遞可以指向element

3. (C)作為對象使用時this指向當前對象。形如:new doSomething();
4. (D)使用apply
或者call方法時,this指向所傳遞的對象。
形如:var obj={}; doSomething.apply(obj,new
Array(」nothing」); //thisàobj

下面我來闡述如何在事件處理中來使用this,之後我會附加一些this相關的例子。
Owner

接下來文章中我們將要討論的問題是:在函數doSomething()中this所指的是什麼?
Javascript代碼
function doSomething() {

this.style.color = '#cc0000';
}
function doSomething() {

this.style.color = '#cc0000';
}

在JavaScript中,this通常指向的是我們正在執行的函數本身(譯者註:用owner代表this所指向的內容),或者是,指向該函數所屬的對象。當我們在頁面中定義了函數doSomething()的時候,它的owner是頁面,或者是JavaScript中的window對象(或
global對象)。對於一個onclick屬性,它為它所屬的HTML元素所擁有,this應該指向該HTML元素。

這種「所有權」就是JavaScript中面向對象的一種方式。在Objects as associative arrays中可以查看一些更多的信息。

如果我們在沒有任何更多准備情況下執行doSomething(),this關鍵字會指向window,並且該函數試圖改變window的
style.color。因為window並沒有style對象,這個函數將非常不幸的運行失敗,並產生JavaScript錯誤。
Copying

因此如果我們想充分利用this,我們不得不注意使用this的函數應該被正確的HTML元素所擁有。換句話說,我們應該復制這個函數到我們的onclick屬性。Traditional
event registration會關心它。
Javascript代碼
element.onclick = doSomething;

element.onclick = doSomething;
這個函數被完整復制到onclick屬性(現在成為了函數)。因此如果這個event
handler被執行,this將指向HTML元素,並且該元素的顏色得以改變。

這種方法使得我們能夠復制這個函數到多個event handler。每次this都將指向正確的HTML元素:

這樣你就可以最大限度使用this。每當執行該函數,this所指向的HTML元素都正確響應事件,這些HTML元素擁有doSomething()的一個拷貝。

Referring
然而,如果你使用inline event registration(內聯事件注冊)
Javascript代碼

<element onclick="doSomething()">
<element
onclick="doSomething()">

你將不能拷貝該函數!反而這種差異是非常關鍵的。onclick屬性並不包含實際的函數,僅僅是一個函數調用。
Javascript代碼

doSomething();
doSomething();

因此,它將聲明「轉到doSomething()並且執行它」。當我們到達doSomething(),this關鍵字又重新指向了全局的window對象,函數返回錯誤信息。

The difference

如果你想使用this來指向HTML元素響應的事件,你必須確保this關鍵字被寫在onclick屬性里。只有在這種情況下它才指向event
handler所注冊的HTML元素。
Javascript代碼
element.onclick = doSomething;

alert(element.onclick)
element.onclick = doSomething;

alert(element.onclick)
你將得到
Javascript代碼
function doSomething()
{
this.style.color = '#cc0000';
}
function doSomething() {

this.style.color = '#cc0000';
}

正如你所見,this關鍵字被展現在onclick函數中,因此它指向HTML元素。
但是如果執行
Javascript代碼

<element onclick="doSomething()">
alert(element.onclick)

<element onclick="doSomething()">
alert(element.onclick)
你將得到

Javascript代碼
function onclick() {
doSomething()
}
function
onclick() {
doSomething()
}

這僅僅是到doSomething()函數的一個引用。this關鍵字並沒有出現在onclick函數中,因此它不指向HTML元素。
例子--拷貝

下面的例子中,this被寫入onclick函數里:
Javascript代碼
element.onclick = doSomething

element.addEventListener('click', doSomething, false)
element.onclick =
function() {this.style.color = '#cc0000';}
<element
onclick="this.sytle.color = '#cc0000';">
element.onclick = doSomething

element.addEventListener('click', doSomething, false)
element.onclick =
function() {this.style.color = '#cc0000';}
<element
onclick="this.sytle.color = '#cc0000';">
例子--引用
下述情況中,this指向window:

Javascript代碼
element.onclick = function() {doSomething()}

element.attachEvent('onclick', doSomething)
<element
onclick="doSomething()">
element.onclick = function() {doSomething()}

element.attachEvent('onclick', doSomething)
<element
onclick="doSomething()">
注意attachEvent()的出現。Microsoft event registration
model最主要的弊端是attachEvent()創建了一個指向函數的引用,而不是復制它。因此有時不可能知道哪個HTML正在處理該事件。
組合使用

當使用內聯事件注冊時,你可以將this發送到函數以至於可以正常使用:
Javascript代碼
<element
onclick="doSomething(this)">
function doSomething(obj) {

//this出現在event handler中並被發送到函數
//obj指向HTML元素,因此可以這樣:
obj.style.color
= '#cc0000';
}

❹ javascript中的this到底指什麼

JavaScript:this是什麼?

定義:this是包含它的函數作為方法被調用時所屬的對象。
說明:這句話有點咬嘴,但一個多餘的字也沒有,定義非常准確,我們可以分3部分來理解它!
1、包含它的函數。2、作為方法被調用時。3、所屬的對象。
看例子:
function to_green(){
this.style.color="green";
}
to_green();
上面函數中的this指的是誰?
分析:包含this的函數是,to_green
該函數作為方法被調用了
該函數所屬的對象是。。?我們知道默認情況下,都是window對象。
OK,this就是指的window對象了,to_green中執行語句也就變為,window.style.color="green"
這讓window很上火,因為它並沒有style這么個屬性,所以該語句也就沒什麼作用。
我們在改一下。

window.load=function(){
var example=document.getElementById("example");
example.onclick=to_green;
}
這時this又是什麼呢?
我們知道通過賦值操作,example對象的onclick得到to_green的方法,那麼包含this的函數就是onclick嘍,
那麼this就是example引用的html對象嘍。
this的環境可以隨著函數被賦值給不同的對象而改變!
下面是完整的例子:

<script type="text/javascript">
function to_green(){
this.style.color="green";
}
function init_page(){
var example=document.getElementById("example");
example.onclick=to_green;
}
window.onload=init_page;
</script>
<a href="#" id="example">點擊變綠</a>

閱讀全文

與javascript中的this相關的資料

熱點內容
win10藍屏是硬碟壞了么 瀏覽:46
沈陽哪裡適合學編程 瀏覽:811
django19常用版本 瀏覽:521
三國志11保存在哪個文件夾 瀏覽:88
iphone4s加速 瀏覽:108
編程內存和顯卡哪個重要 瀏覽:672
android連接網路列印機 瀏覽:195
linuxsftp如何上傳文件 瀏覽:603
蘋果文件覆蓋 瀏覽:327
網路足彩名人有哪些 瀏覽:639
pc共享網路給電腦 瀏覽:796
linuxkill重啟進程 瀏覽:658
sketchup景觀教程 瀏覽:730
win10管理找不到模塊 瀏覽:472
蘋果手機查看電腦文件 瀏覽:61
微信不訪問視頻文件夾嗎 瀏覽:259
文件夾加密大師注冊碼 瀏覽:1
onedrive怎麼上傳文件 瀏覽:488
android多線程寫文件棧溢出 瀏覽:242
台電酷閃量產工具 瀏覽:837

友情鏈接