箭頭函式的this指向(二)

xiao&xin發表於2020-12-20

首先來看一個簡單的例子:

let obj = {
      fun(){
        setTimeout(function(){
          console.log(this); // window
        }, 1000);

        setTimeout(() => {
          console.log(this); // {fun: f}
        }, 1000)
      }
    };
    
obj.fun();

通過這個例子不難看出,this指向發生改變,箭頭函式確實可以使this指向一個合理的作用域,從而我們可以得出這樣的結論:

箭頭函式的this引用的是最近作用域的中的this,箭頭函式的this指向的是外層作用域中,一層層查詢,直到有this的定義。

然後我們再來看一個稍微複雜的例子:

let obj = {
      fun(){
        setTimeout(function(){
          setTimeout(function(){
            console.log(this); // window, this 的預設繫結到window
          }, 1000);

          setTimeout(() => {
            console.log(this); // window, 外層作用域中指向的還是window, 因為這個函式的外部this是預設繫結
          }, 1000)
        });

        setTimeout(() => {
          setTimeout(function(){
            console.log(this); // window, this 的預設繫結到window
          }, 1000);

          setTimeout(() => {
            console.log(this); // {fun: f}, 外層作用域作用this的指向是{fun:f}
          }, 1000)
        })
      }
    };
    
 obj.fun();

根據結論和註釋認真思考一下,get到了嗎?

相關文章