震驚!this竟然是這樣的...

簡單瞭解this

咱們在JS代碼中時常會見到一個小小的this,好比:數組

var a=1;
    let f=()=>console.log(this.a)
    f()
複製代碼

那麼上面的this究竟是什麼意思呢?首先咱們知道全局的變量都會掛到window上(let聲明的變量不會掛在window上,這一點我在上一篇ES6中關於let的部分提到過),與此同時上面的代碼運行後會獲得1,那麼這裏咱們能夠暫時看做window=this,那麼是否是this一直至關於window呢?咱們來分析一下。app

this的特性

1,this的值隨時可能會變,只有在調用時才能肯定。

2,不能手動地修改this的值

3,this究竟是什麼?

this是一個對象,這個對象是指向當前代碼中的所需的各種資源。函數

this在函數內部的四種狀況

1,這個函數不是某一個對象的屬性,就是一個普通的被調用的函數。

能夠看到打印出的結果是window,由於f這個函數也屬於全局變量的一種,因此掛在window上,這裏的this就指向window。

2,這個函數是一個具體的對象的屬性。

上面this所在的函數是obj對象的一個屬性,當咱們經過obj對象調用這個函數時,這裏的this就指向了obj這個對象,從而打印出了obj對象。

3,若是在調用函數以前加一個new的話,會建立並返回一個新的對象,而這個函數內部的this就會指向這個新對象。

4,能夠經過Function對象的apply和call方法來指定函數內部的this的值。

這裏的apply和call方法能夠看做是i對象和j對象借用了f函數,同時this的指向也變成了i和j。 apply的call方法的差別在於apply方法在傳遞參數時需以數組的形式。

原型鏈與this的綜合應用

1,在數組找指定的元素,若是找到,就返回這個元素的下標。

2,刪除數組中的指定的元素若是數組中有這個值,就刪除。沒有就不作操做。

結論

若是方法內部有this,如何肯定這個this的值呢?this

  • 誰調用了this,this就指向誰!spa

  • (1)有明確的對象3d

    例如:Obj.say();say 的當前對象是obj,因此say中的this 就指向obj。
    複製代碼
  • (2)沒有明確的對象code

    若是這個函數沒有明確說是哪一個對象的,則它確定是屬於window對象的,因此this就會指向window。
    複製代碼
  • 若是是call和apply的方式cdn

    this指向第一個參數,例如:f.call(obj),f中的this指向obj。
    複製代碼
  • 在調用方法時,才知道this的真正指向!對象

相關文章
相關標籤/搜索