javascript中的this意義非常豐富,它可以是全域對象,目前物件或是任意對象,這都取決於函數的呼叫方式。函數有以下幾種呼叫方式:作為物件方法呼叫、作為函數呼叫、作為建構函式呼叫、apply或call呼叫。
物件方法呼叫
作為物件方法呼叫的時候,this會被綁定到該物件。
var point = { x : 0, y : 0, moveTo : function(x, y) { this.x = this.x + x; this.y = this.y + y; } }; point.moveTo(1, 1)//this 绑定到当前对象,即 point 对象
這裡我想強調一點內容,就是this是在函數執行的時候去取得對應的值,而不是函數定義時。即使是物件方法調用,如果該方法的函數屬性以函數名稱的形式傳入別的作用域,也會改變this的指向。我舉一個例子:
var a = { aa : 0, bb : 0, fun : function(x,y){ this.aa = this.aa + x; this.bb = this.bb + y; } }; var aa = 1; var b = { aa:0, bb:0, fun : function(){return this.aa;} } a.fun(3,2); document.write(a.aa);//3,this指向对象本身 document.write(b.fun());//0,this指向对象本身 (function(aa){//注意传入的是函数,而不是函数执行的结果 var c = aa(); document.write(c);//1 , 由于fun在该处执行,导致this不再指向对象本身,而是这里的window })(b.fun);
這樣就明白了吧。這是一個容易混淆的地方。
函數調用
函數也可以直接被調用,這時候this被綁定到了全域物件。
var x = 1; function test(){ this.x = 0; } test(); alert(x); //0
但這樣就會出現一些問題,就是在函數內部定義的函數,其this也會指向全局,而和我們希望的恰恰相反。程式碼如下:
var point = { x : 0, y : 0, moveTo : function(x, y) { // 内部函数 var moveX = function(x) { this.x = x;//this 绑定到了全局 }; // 内部函数 var moveY = function(y) { this.y = y;//this 绑定到了全局 }; moveX(x); moveY(y); } }; point.moveTo(1, 1); point.x; //==>0 point.y; //==>0 x; //==>1 y; //==>1
我們會發現不但我們希望的移動呢效果沒有完成,反而會多出兩個全域變數。那麼如何解決呢?只要要進入函數中的函數時將this儲存到一個變數中,再運用該變數即可。程式碼如下:
var point = { x : 0, y : 0, moveTo : function(x, y) { var that = this; // 内部函数 var moveX = function(x) { that.x = x; }; // 内部函数 var moveY = function(y) { that.y = y; } moveX(x); moveY(y); } }; point.moveTo(1, 1); point.x; //==>1 point.y; //==>1
建構子呼叫
在javascript中自己建立建構函式時可以利用this來指向新建立的物件上。這樣就可以避免函數中的this指向全域了。
var x = 2; function test(){ this.x = 1; } var o = new test(); alert(x); //2
apply或call呼叫
這兩個方法可以切換函數執行的上下文環境,也就是改變this綁定的物件。 apply和call比較類似,差別在於傳入參數時一個要求是數組,一個要求是分開傳入。所以我們以apply為例:
<pre name="code" class="html">var name = "window"; var someone = { name: "Bob", showName: function(){ alert(this.name); } }; var other = { name: "Tom" }; someone.showName(); //Bob someone.showName.apply(); //window someone.showName.apply(other); //Tom
可以看到,正常存取物件中方法時,this指向物件。使用了apply後,apply無參數時,this的目前物件是全域,apply有參數時,this的目前物件就是該參數。
箭頭函數呼叫
這裡需要補充一點內容,就是在下一代javascript標準ES6中的箭頭函數的 this總是指向函數定義時的 this總是指向函數定義時的
this
我們透過一個例子來理解:
var o = { x : 1, func : function() { console.log(this.x) }, test : function() { setTimeout(function() { this.func(); }, 100); } }; o.test(); // TypeError : this.func is not a function上面的程式碼會出現錯誤,因為this的指向從o變為了全局。我們需要修改上面的程式碼如下:
var o = { x : 1, func : function() { console.log(this.x) }, test : function() { var _this = this; setTimeout(function() { _this.func(); }, 100); } }; o.test();透過使用外部事先保存的this就行了。這裡就可以利用到箭頭函數了,我們剛才說過,箭頭函數的 this總是指向函數定義時的
this
,而非執行時
。所以我們將上面的程式碼修改如下:var o = { x : 1, func : function() { console.log(this.x) }, test : function() { setTimeout(() => { this.func() }, 100); } }; o.test();
這回this就指向o了,我們還需要注意一點的就是這個this是不會改變指向對象的,我們知道call和apply可以改變this的指向,但是在箭頭函數中是無效的。
var x = 1, o = { x : 10, test : () => this.x }; o.test(); // 1 o.test.call(o); // 依然是1
以上是JavaScript之this指針範例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何對多個鏈接進行並發GET請求並依次判斷返回結果?在Tampermonkey腳本中,我們經常需要對多個鏈...


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

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

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

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

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中