JavaScript中的this對象指向理解


在JavaScript中,this不是固定不變的,它的指向取決於上下文環境,一般的,認為this指向使用它時所在的對象。主要有以下幾類指向:

  • 在方法中,this 表示該方法所屬的對象。
  • 如果單獨使用,this 表示全局對象。
  • 在函數中,this 表示全局對象。
  • 在函數中,在嚴格模式下,this 是未定義的(undefined)。
  • 在事件中,this 表示接收事件的元素。
  • 類似 call() 和 apply() 方法可以將 this 引用到任何對象。

一、方法中的this

var isObject = {
    a: 'inner object',
    innerFunction: function() {
        return this.a;
    }
}
console.log('方法里的this指向:', isObject.innerFunction());
//輸出結果:方法里的this指向: inner object

由上面代碼可以看出,因為對象調用了其內部方法innerFunction(),所以此時this指向使用它時所在的對象,即isObject對象。

如果我們此時在innerFunction()函數里return this,此時控制台打印出Object {a: "inner object", innerFunction: },表示this正好指向isObject對象。

二、單獨使用this

var x = this;
console.log("this指向:", x);
//輸出結果:this指向: Window {postMessage: , blur: , focus: , close: , parent: Window, …}

可以看出,當單獨使用this時,this指向window對象

三、函數中使用this

var variable = 'test';

 function outerFunction() {
     var variable = 0;
     return this.variable;
 }

 console.log('函數中this指向:', outerFunction());
 //輸出結果:函數中this指向:test

從上面代碼看出,函數中的this指向window對象,所以打印出的結果是test而不是0。

如果我們此時在outerFunction()函數里return this,此時控制台打印出Window {postMessage: , blur: , focus: , close: , parent: Window, …},表示this指向window對象。

值的注意的一點是在嚴格模式中,函數並不能綁定到this上,所以這時候的this是undefined。

再來看一個例子:

var a = 21; 
var isObject = {
    a: 'inner object',
    innerFunction: function() {
        return this.a;
    }
}
var useObject = isObject.innerFunction;
console.log('結果:', useObject());
//輸出結果:結果:21

可能有人會問,為什么輸出的不是inner object,而是21,注意,this指向的是使用它時所在的對象,因為isObject.innerFunction將自身賦給全局變量useObject,所以此時useObject保存的是innerFunction()方法,this指向全局。

四、事件中的this

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>

<button onclick="this.style.display='none'">點我我就消失</button>

</body>
</html>

很顯然,在HTML事件句柄中,this指向了接收事件的HTML元素。

五、箭頭函數中的this

需要注意的是,箭頭函數內部並沒有綁定this的機制,所以this的指向是固定的,即指向當前定義時所在的對象(注意,一般情況下,上下文環境不做變化,this為全局對象,即this定義在頂層環境)。也可以說,內部的this就是外層代碼塊的this。

var isObject = {
        a: 'hhh',
        functions: () => {
            console.log("對象:",this);
        }
    }
isObject.functions();
//輸出結果:對象:Window {postMessage: , blur: , focus: , close: , parent: Window, …}

可以看到,同樣是對象方法,箭頭函數里的this指向的是window對象。

再來看一個例子:

var isObject = {
        a: 'hhh',
        functions: () => {
            this.a = 0
            console.log("結果:",this.a);
        }
    }
isObject.functions();
//輸出結果:結果:0

此時,在isObject對象functions方法內部定義了一個屬性a,它屬於this全局對象,所以輸出結果為0。

難道this只能指向window了嗎?答案是否定的,再來看一個例子:

function myFunction() {
     var innerfunction = () => {
        console.log('x:', this.x);
     }
     return innerfunction;
 }

var test = myFunction.call({x: 1});

test();
//輸出結果:1

從上面代碼可以看出,this此時指向myFunction里的對象{x:1},所以打印出的結果為1。注意,因為箭頭函數本身並不能綁定this,所以它不能使用apply,call,bind方法來改變上下文環境。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM