目錄
物件方法呼叫
函數調用
建構子呼叫
apply或call呼叫
箭頭函數呼叫
首頁 web前端 js教程 JavaScript之this指針範例程式碼詳解

JavaScript之this指針範例程式碼詳解

Mar 10, 2017 pm 03:13 PM

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
登入後複製
這樣就可以明白各種情況下this綁定物件的差別了。

🎜🎜🎜🎜 🎜

以上是JavaScript之this指針範例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 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:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術

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

如何使用WebSocket和JavaScript實現線上預約系統

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

如何利用JavaScript和WebSocket實現即時線上點餐系統

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

簡易JavaScript教學:取得HTTP狀態碼的方法

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

JavaScript與WebSocket:打造高效率的即時天氣預報系統

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

如何在JavaScript中取得HTTP狀態碼的簡單方法

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

javascript如何使用insertBefore

See all articles