關於this指標指向的知識回顧

常好樂發表於2017-09-19

由於上一篇部落格,這讓我想起了另外一個關於this指標的問題。

 var a = 20;  
    var obj = {  
        a: 10,  
        c: this.a + 20,  
        fn: function () {  
            return this.a;  
        }  
    }  

    console.log(obj.c);//返回40  
    console.log(obj.fn());//返回10  
var aaa = obj.fn;  
console.log(aaa())//返回20複製程式碼

關於第一個呼叫返回40的問題,要知道this的指向是在函式被呼叫的時候被確定下來的。此時沒有呼叫任何函式,只是單純的宣告c並給c做賦值。作用域還是在預設的全域性作用域中,this自然指向全域性作用域,this.a也就是window.a,,a也就是.20,最後列印出來的c也就是40。
之前有一個錯誤的觀念是千萬不要以為在一個物件的{}花括弧中的this,這個this就一定指向這個物件。要知道this的指向是在函式呼叫時被確定的!!!此時沒有呼叫任何函式,this也就只指向當前作用域,此處也就是全域性。
在第二個列印中,因為此時呼叫了函式,this自然就指向函式所在的物件也就是obj物件,a也就是10。

如果函式獨立呼叫,那麼該函式內部的this,則指向undefined。在非嚴格模式中,當this指向undefined時,它會被自動指向全域性物件。
例如aaa() 是獨立呼叫,那麼aaa函式裡面的this會指向undefined,在非嚴格模式下面指向的是全域性物件。因此此時的a為20。

我對函式呼叫時,this指向總結了如下三點:
1、this的指向,是在函式被呼叫的時候確定的!!!!!!!!
2、函式呼叫時,看其是否被某個物件所擁有,假如被某個物件擁有,那麼函式中的this,指向的是其擁有的物件。
例如:
obj.fn()
fn()函式被obj所擁有,那麼fn裡面的this,指向的是obj
3、如果函式獨立呼叫,那麼該函式內部的this,則指向undefined。在非嚴格模式中,當this指向undefined時,它會被自動指向全域性物件。
例如aaa() 是獨立呼叫,那麼aaa函式裡面的this會指向undefined,在非嚴格模式下面指向的是全域性物件。

相關文章