ES6中的this和普通函數中的this

在普通函數中的this:

this的值是在執行的時候才能確認,定義的時候不能確認!爲什麼呢 —— 因爲this是執行上下文環境的一部分,而執行上下文需要在代碼執行之前確定,而不是定義的時候。

1、this總是代表它的直接調用者,比如:obj.fun,那麼fun中的this是obj

2、如果沒有直接調用者,默認情況下(非嚴格模式)this爲window對象

3、嚴格模式中('use strict'),this爲undefined

TIPS:可以使用call、apply、bind改變this的指向。

ES6中的this:

箭頭函數沒有自己的this,它的this就是定義箭頭函數時this的指向,即繼承父級的this,這個父級是什麼意思呢?

先來理解作用域,在JS中,每一個函數有自己的作用域,創建一個函數時,就會創建一個“上下文對象”,在函數中我們是可以聲明另一個函數的,這個函數也會有自己的上下文對象,它與父級以及祖先級的上下文對象形成了作用域鏈,可以簡單的理解作用域鏈就是所有“上下文對象”串聯起來的鏈條,而這個父級就是指箭頭函數所在作用域鏈上的上一個“上下文對象”,有點繞口,通過一個例子來說明:

TIPS:關於作用域請查看js之作用域和內存問題

var a=100;
var b = {
  a:1000,
  b:{
    a:1,
    c:{
      a:22,
      getA:()=>{
        console.log(this.a);
      }
    }	
  }
}

執行b.b.c.getA();

最後執行的結果是100,爲什麼呢,因爲執行getA時,作用域鏈中的第一個對象是getA函數本身的上下文對象,上一層對象就是頂層的window對象的上下文對象,它的this是指向window的。

再來看一個例子:

var a=100;
var b = {
  a:1000,
  b:{
    a:1,
    c:{
      a:22,
      getA:()=>{
        console.log(this.a);
      }
    },	
    d:function(){
      return {
        getA:()=>{
          console.log(this.a);
        }
      }
    }
  }
}

執行b.b.d().getA();

最後結果爲1。

此時的作用域鏈爲getA -> d -> window,getA爲箭頭函數,因此它的this指向的就是作用域鏈中的d函數,而d函數中的this指向的是b.b對象,因此this.a就是b.b.a,所以結果爲1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章