首頁 web前端 js教程 深入理解Javascript中this的作用域_javascript技巧

深入理解Javascript中this的作用域_javascript技巧

May 16, 2016 pm 04:39 PM
javascript

大家在使用Javascript的時候常常被this這傢伙搞得暈頭轉向的。對大多數有OOP開發經驗的開發人員來說this是當前作用域中引用普通元素的標識符,但是在Javascript中它卻顯得古靈精怪的,因為它不是固定不變的,而是隨著它的執行環境的改變而改變。在Javascript中this總是指向呼叫它所在方法的物件。

舉一個簡單的例子:

複製程式碼 程式碼如下:

function test(){
alert(this);
}
var obj=function(){
var name='testObj';
}
obj.objTest=test;
test();
obj.objTest();

把這段程式碼放到HTML中執行這個頁面,你會看到先提示一個警告[object window],然後第二個警告。

複製程式碼 程式碼如下:

var obj=function(){
var name='testObj';
}

我們先定義了一個test()方法,並在方法內部呼叫alert()方法將this顯示出來,然後定義了一個obj函數對象,並給它加了一個私有的字段name,同時給它加了一個靜態的方法objTest(),而這個函數則直接指向test()函數。

分別呼叫test()和obj.objTest()方法,第一次警告框提示的是Window對象,而第二次提示的是我們定義的obj這個函數的程式碼。這說明了test函數在兩次執行的時候this的值是不同的!

這就說明了當呼叫函數的物件不同的時候,其內部的this關鍵字指涉的物件是不同的。這裡需要值得注意的是Javascript是基於物件的語言,當我們的變數或函數定義在<script></script>標籤的根下的時候其實相當於給window物件加了對應的屬性或方法,所以當我們利用function test(){}程式碼定義一個函數的時候,其實相當於為window物件增加了一個新的函數,也就是window.test()函數。

我們可以做個實驗:

複製程式碼 程式碼如下:

function test(){
alert(this);
}
alert(test===window.test);

警告框提示的將是true,這表示當我們在呼叫test()這個函數時相當於呼叫的是window.test()。所以當我們呼叫test()函數的時候呼叫這個函數的對像其實是window對象,this指涉的是window對象,所以我們在alert(this)的時候彈出的警告視窗內容是[object Window]。我們將obj.objTest=test相當於把obj.objTest()指向test(),所以當我們呼叫obj.objTest()函數時相當於在obj呼叫了test()這個函數,所以現在this指代的是obj對象,提示的就是obj這個Function也就是我們看到的程式碼。

說到這應該也解釋的差不多了,可能上面的例子太抽象,想像不出來它能在什麼情況下用到,那我們現在就假設一個需求,做一個貼近實用一點的例子。

假設我們現在頁面中的所有超連結在點擊之後顏色要改為紅色,用Javascript實作。大體的想法應該是取得頁面中所有的標籤,然後遍歷所有的標籤,給每一個註冊一個click事件,事件觸發後我們將它的color值設為red。

範例程式碼如下:

複製程式碼 程式碼如下:

//改顏色
function changeColor(){
this.style.color='#f00';
}
//初始化,給所有 a 標籤註冊事件
function init(){
var customLinks=document.getElementsByTagName('a');
for(i in customLinks){
//你也可以使用事件偵聽器方式來註冊事件
//由於要相容IE,FF等瀏覽器可能需要更多程式碼,您可以自行編寫
customLinks[i].onclick=changeColor;
}
}
window.onload=init;

將這段程式碼加入HTML文件中,並在文件中加入一些超鏈接,當超連結點擊後顏色會變成紅色,這裡我們定義的changeColor()函數中this關鍵字在點擊超連結觸發函數的時候它指涉的是當前這個超連結。而如果你直接呼叫changeColor()函數瀏覽器會報錯,提示Error: ‘this.style' is null or not an object或undefined之類的錯誤。

不知道說到這能不能讓正在看文章的你對Javascript中的this關鍵字有了一些自己的了解呢?還是你已經不耐煩了? (:P)

其實要想真正對這個問題有更深入的理解那麼必須對Javascript的作用域和作用域鏈有深入的理解。

作用域,顧名思義就是指某一屬性或方法具有存取權限的程式碼空間,簡單的說也就是這個變數或方法它在程式碼中的適用範圍。在大多數的OOP中主要有public,private,protect三種作用域,對著三種作用域在這裡就不詳細解釋了,如果有OOP的經驗應該都有深入的了解。這裡我要說的是這三種作用域類型對Javascript來說幾乎是毫無意義的,因為Javascript中只有一種公共作用域,在Javascript中作用域是在函數中進行維護的。舉例:

複製程式碼 程式碼如下:

var test1='globle variable';
function example(){
var test2='example variable';
alert(test1);
alert(test2);
}
example();
alert(test1);
alert(test2);

根據我們前面解釋的,這裡的test1變數相當於window的一個屬性,所以它會在整個window作用域內起作用,而test2則在example()函數的內部聲明,所以它的作用域也就維持在example()方法的內部,如果在函數的外部呼叫test2瀏覽器會提示出錯。而在example()內部呼叫test1則沒問題。

根據這個我們再舉一個例子:

複製程式碼 程式碼如下:

var test='globle variable';
function example(){
var test='example variable';
}
example();
alert(test);

這個範例運行會是什麼結果呢?對,警告框會提示“globle variable”,因為example()函數內部的test變數其作用域只維持在內部,不會影響外部的test變數。如果我們將example()內部test變數的var關鍵字去掉呢?你可以自己試試看。

說到這就有牽扯出另外一個概念,那就是作用域鏈的概念。作用域鏈就是可以確定變數值的路徑。由上面一個例子可以看出,var關鍵字是用來維護作用域鏈的,如果變數使用了var關鍵字聲明那麼他就可以看作為作用域鏈的終點。同樣函數的形參的定義也會起到類似的作用。

說到這你對this這個精靈古怪的傢伙有了比較清晰的認識了吧?根據它簡單的一個詮釋,this總是指向調用它所在函數的對象,根據作用域和作用域鏈,我們會很清晰的確定this的真面目。臨末再來一個開始那個例子的簡單變化:

複製程式碼 程式碼如下:

function test(){
alert(this);
}
var obj=function(){
var name='testObj';
}
obj.objTest=test;
obj.objTest2=function(){
test();
}
test();
obj.objTest();
obj.objTest2();

你猜會提示什麼內容呢?你可以運行一下試試(:P);

既然this是根據呼叫其所在函數的物件的改變而改變的,那我們可不可以強制改變它的呼叫物件呢?答案是肯定的,以後的文章會介紹一下這部分內容,以及Javascript中不同類型的資料成員的實作方式,閉包等概念。

本人在學習過程中的一些經驗和心得體會,寫出來一是與大家分享另外也能檢視自己的不足,如寫的有問題還請批評指教,甚為感謝!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

See all articles