Javascript淺談之this_基礎知識
介紹
this在各種對面物件程式設計中起著非常重要的作用,主要用於指向調用的物件。不過在JavaScript中,this的表現有很大差異,特別是不同執行上下文。
由前文我們知道this也是屬於執行上下文中的一個屬性,所有它命中註定和執行上下文脫不了乾系。
activeExecutionContext = {
在Javascript中,this的取值取決於呼叫的模式。呼叫模式總共有四種:方法呼叫模式、函式呼叫模式、建構器呼叫模式和apply呼叫模式。
呼叫模式
方法呼叫模式
程式碼如下:
var myObject = { 🎜> increment : function(inc) {
this.value = typeof inc
myObject.increment();
console .log(myObject.value); //輸出:1
myObject.increment(3);
console.log(myObject.value); //輸出:4
因為可以透過this存取到自己所屬的對象,所有可以透過它來呼叫和修改對像中屬性或方法。由前文可知,this作為執行上下文中屬性的一員,必然是在上下文創建時才創建,所有this到對象的綁定發生在調用的時候,這屬於「延遲綁定」。透過延遲綁定可以實現this的高度復用。
var b = { value : "b"};
a.showValue = showValue;
b .showValue = showValue;
a.showValue(); //輸出「a」
b.showValue(); //輸出「b」
上例中函數showValue就屬於延遲綁定。
函數調用模式
當一個函數並非作為一個物件的方法來調用,這時就是函數調用。函數呼叫模式中,this被綁定到全域物件。 (這是語言設計上的錯誤)
複製程式碼
}
依照正常思路,應該如第四行所輸出那樣,this指向函數所屬對象,可是由於語言設計上面的問題導致this指向的卻是全局對象。這個更是讓this變得神秘,令人捉摸不透。但是作為開發者,這種情況肯定是我們所不願意見到的,不按常理出牌這是,還好補救措施也很簡單,就是上例中用that指代this。這樣,在helper方法中呼叫that就可以當this使用,簡單方便。至於函數呼叫模式為什麼this會這樣,後面在分析引用型別時會詳加說明。
建構器呼叫模式
由於javascript是基於原型繼承,但是它的設計者又想要它能像傳統的物件導向語言那樣能透過new和建構函數創建對象,現實面向對象程式設計。這個似乎不是什麼好的構想,有點畫虎不成反類犬的尷尬。一是學不來,而是沒必要學。 javascript的原型繼承機制已經非常強大,足以滿足物件導向所需的繼承多型。
閒話少敘,還行言歸正傳說說構造器調用模式。建構器呼叫模式這個非常簡單,它就是就一個函數當做建構器,然後將你打算公用的屬性和方法用this引進宣告。如下
f .name = name;
this.age = age;
this.say = function(){
this. age);
}
}
var p1 = new Person("jink", 24);
p1.say(); //輸出 name : jink, age : 24
p2.say();//輸出 name : 張三, age : 33
apply呼叫模式
javascript中所有函數創建之後,都會自帶兩個方法:apply和call。這兩個方法的具體使用,我在此就不想詳細說明,不知道的同學可以百度一下,挺簡單的。透過兩個方法,我們可以手動設定this。雖然this在創建時候是不允許修改的,但是,我們在創建之前,手動設定過,那就是另外一回事了。這個設置,可不得了,你就可以讓你的對象調用任意方法,就好像你可以讓汽車大海中航行,非洲像如美洲豹一樣飛馳,程式設計師像鋼琴師一樣彈奏。哈哈想像總是美好的,調用歸調用,但是調用了能不能實現功能就另說了。
hand : "靈活的雙手",
programme : function(){
console.log(this.name "使用🎜>}
var pianist = {
name : "鋼琴家",
hand : "彈性的雙手", play : function(){
}
var player = {
name : "運動員",
foot : "矯健的雙腿",
this.foot "在賽場上賓士。"); }
}
//循規蹈矩
programmer.programme(); //程式設計師用靈活的雙手寫程式碼。
pianist.play(); //鋼琴家用靈活的雙手彈奏動聽的樂曲。
player.run(); //運動員用矯健的雙腿在賽場賓士。
//異想天開
player.run.apply(programmer); //程式設計師用undefined在賽場上賓士。 由於自身運動缺乏,沒有矯正的雙腿
上面看著是不是挺有意思的,apply的第一個參數就是執行方法中的this指向。這樣我們就可以藉用別人的方法自己私下偷偷的用,可謂方便至極。在一些框架中常用的此類技巧。
總結
關於this就說這麼多,相信大家看過之後,對在不同情境中this的判定都有些了解了,本來打算討論接下來討論引用對象的,闡述一下方法呼叫模式和函數呼叫模式中this取值的原理,但害怕篇幅過長,所以決定用單獨一章向大家分析一下引用對象這個概念。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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