javascriptthis什麼意思
this的中文意思是“當前;這個”,是javascript中的一個指標型變量,它指向當前函數的運行環境。在不同的場景中呼叫同一個函數,this的指向會發生變化,但它永遠指向其所在函數的真實呼叫者;如果沒有呼叫者,this就指向window。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
JavaScript 函數的作用域是靜態的,但是函數的呼叫卻是動態的。由於函數可以在不同的運行環境內執行,因此 JavaScript 在函數體內定義了 this 關鍵字,用來取得目前的運行環境。
this 是一個指標型變量,它指向目前函數的運行環境。
在不同的場景中呼叫同一個函數,this的指向也可能會發生變化,但是它永遠指向其所在函數的真實呼叫者(誰呼叫就指向誰);如果沒有呼叫者,this就指向全域物件window。
使用 this
this 是由 JavaScript 引擎在執行函數時自動產生的,存在於函數內的動態指針,指涉目前呼叫物件。具體用法如下:
this[.属性]
如果 this 未包含屬性,則傳遞的是目前物件。
this 用法靈活,其包含的值也是變化多端。例如,下面範例使用 call() 方法不斷改變函數內 this 指涉物件。
var x = "window"; //定义全局变量x,初始化字符串为“window” function a () { //定义构造函数a this.x = "a"; //定义私有属性x,初始化字符a } function b () { //定义构造函数b this.x = "b"; //定义私有属性x,初始化为字符b } function c () { //定义普通函数,提示变量x的值 console.log(x); } function f () { //定义普通函数,提示this包含的x的值 console.log(this.x); } f(); //返回字符串“window”,this指向window对象 f.call(window); //返回字符串“window”,指向window对象 f.call(new a()); //返回字符a,this指向函数a的实例 f.call(new b()); //返回字符b,this指向函数b的实例 f.call(c); //返回undefined,this指向函数c对象
以下簡單總結 this 在 5 個常用場景中的表現以及應對策略。
1. 普通呼叫
下面範例示範了函數參考和函數呼叫對 this 的影響。
var obj = { //父对象 name : "父对象obj", func : function () { return this; } } obj.sub_obj = { //子对象 name : "子对象sub_obj", func : obj.func } var who = obj.sub_obj.func(); console.log(who.name); //返回“子对象sub_obj”,说明this代表sub_obj
如果把子物件 sub_obj 的 func 改為函數呼叫。
obj.sub_obj = { name : "子对象sub_obj", func : obj.func() //调用父对象obj的方法func }
則函數中的 this 所代表的是定義函數時所在的父物件 obj。
var who = obj.sub_obj.func; console.log(who.name); //返回“父对象obj”,说明this代表父对象obj
2. 實例化
使用 new 指令呼叫函數時,this 總是指涉實例物件。
var obj = {}; obj.func = function () { if (this == obj) console.log("this = obj"); else if (this == window) console.log("this = window"); else if (this.contructor == arguments.callee) console.log("this = 实例对象"); } new obj.func; //实例化
3. 動態呼叫
使用 call 和 apply 可以強制改變 this,使其指向參數物件。
function func () { //如果this的构造函数等于当前函数,则表示this为实例对象 if (this.contructor == arguments.callee) console.log("this = 实例对象"); //如果this等于window,则表示this为window对象 else if (this == window) console.log("this = window对象"); //如果this为其他对象,则表示this为其他对象 else console.log("this == 其他对象 \n this.constructor =" + this.constructor); } func(); //this指向window对象 new func(); //this指向实例对象 cunc.call(1); //this指向数值对象
在上面範例中,直接呼叫 func() 時,this 代表 window 物件。當使用 new 指令呼叫函數時,將會建立一個新的實例對象,this 就指向這個新建立的實例物件。
使用call() 方法執行函數func() 時,由於call() 方法的參數值為數字1,則JavaScript 引擎會將數字1 強制封裝為數值對象,此時this 就會指向這個數值物件。
4. 事件處理
在事件處理函數匯總,this 總是指向觸發該事件的物件。
<input type="button" value="测试按钮" /> <script> var button = document.getElementsByTagName("put")[0]; var obj = {}; obj.func = function () { if (this == obj) console.log("this = obj"); if (this == window) console.log("this = window"); if (this == button) console.log("this = button"); } button.onclick = obj.func; </script>
在上面程式碼中,func() 所包含的this 不再指向物件obj,而是指向按鈕button,因為func() 是被傳遞給按鈕的事件處理函數之後才被呼叫執行的。
如果使用DOM2 等級標準註冊事件處理函數,程式如下:
if (window.attachEvent) { //兼容IE模型 button.attachEvent("onclick", obj.func); } else { //兼容DOM标准模型 button.addEventListener("click", obj.func, true); }
在IE 瀏覽器中,this 指向window 物件和button 對象,而在DOM 標準的瀏覽器中僅指向button 對象。因為,在 IE 瀏覽器中,attachEvent() 是 window 物件的方法,當呼叫該方法時,this 會指向 window 物件。
為了解決瀏覽器相容性問題,可以呼叫 call() 或 apply() 方法強制在物件 obj 身上執行方法 func(),避免出現不同的瀏覽器對 this 解析不同的問題。
if (window.attachEvent) { button.attachEvent("onclick", function () { //用闭包封装call()方法强制执行func() obj.func.call(obj); }); } else { button.attachEventListener("onclick", function () { obj.func.call(obj); }, true); }
當再次執行時,func() 中包含的 this 總是指向物件 obj。
5. 定時器
使用定時器呼叫函數。
var obj = {}; obj.func = function () { if (this == obj) console.log("this = obj"); else if (this == window) console.log("this = window对象"); else if (this.constructor == arguments.callee) console.log("this = 实例对象"); else console.log("this == 其他对象 \n this.constructor =" + this.constructor); } setTimeOut(obj.func, 100);
在 IE 中 this 指向 window 物件和 button 對象,具體原因與上面講解的 attachEvent() 方法相同。在符合 DOM 標準的瀏覽器中,this 指向 window 對象,而不是 button 物件。
因為方法 setTimeOut() 是在全域作用域中被執行的,所以 this 指向 window 物件。若要解決瀏覽器相容性問題,可以使用 call 或 apply 方法來實作。
setTimeOut (function () { obj.func.call(obj); }, 100);
【相關推薦:javascript學習教學】
#以上是javascriptthis什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++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是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
