一般関数と矢印関数のthisは

12601 ワード

  • 一般関数のthisはWindow
  • を指す
    function a(){
       console.log(this)   
    }
    a()    //Window
    
  • Domエレメントバインドイベントのthis、ハンドルのthis値はエレメントの参照
  • です.
    document.onclick(function(){
      console.log(this)
    })  //this
    
  • setIntervalとsetTimeoutから関数が入力されると、関数のthisはwindowオブジェクト
  • を指します.
    var num = 0;
    function Obj (){
        this.num = 1,
        this.getNum = function(){
            console.log(this.num);
        },
        this.getNumLater = function(){
            setTimeout(function(){
                console.log(this.num);
            }, 1000)
        }
    }
    var obj = new Obj; 
    obj.getNum();//1   obj.num, 1
    obj.getNumLater()//0   window.num, 0
    

    settimeout()によって呼び出されたコードは、その関数から完全に分離された実行環境で実行されます.これにより、これらのコードに含まれるthisキーはwindowがcallとapplyまたはbindを使用してタイマのthisポインタを変更できることを指します.
    var num = 0;
    function Obj (){
        this.num = 1,
        this.getNum = function(){
            console.log(this.num);
        },
        this.getNumLater = function(){
            setTimeout(function(){
                console.log(this.num);
            }.bind(this), 1000)
        }
    }
    var obj = new Obj; 
    obj.getNum();//1   obj.num, 1
    obj.getNumLater(this)//0   obj.num, 1
    

    上のコードでbindを使用してタイマのthisの指向を変更したのは、callとapplyがすぐに呼び出されるため、タイマの遅延効果を変更し、タイマは使用されず、bindを使用します.
    apply、call、bindの3つは、関数を変更するために使用されるthisオブジェクトの指向である.
    apply、call、bindの3つの最初のパラメータは、thisが指すオブジェクト、すなわち指定したいコンテキストです.apply、call、bindの3つはいずれも後続のパラメータを利用してパラメータを伝達することができる.
    bindは対応する関数を返し、後で呼び出すのに便利です.apply、callは即時呼び出しです.
  • オブジェクトのthisはオブジェクト自体
  • を指す.
    var obj ={
     a:function(){
      console.log(this)  //{a: ƒ}
    }
    }
    obj.a()   
    
    var obj ={
     a:function(){
      console.log(this) 
    },
     say:function(){
       var _this =this;
       setTimeout(function(){
          console.log(_this)
       })
      }
    }  
    obj.a()   //{a: ƒ, say: ƒ}   //this obj
    
    window.val = 1;
    var obj = {
     val:2,
     dbl:function(){
      this.val *=2;
      val *=2;
        console.log(val)   //val val  1*2=2
        console.log(this.val)  //obj val   2*2=4
     }
    }
    obj.dbl()   //2 4 
    
    window.val = 1;
    var obj = {
     val:2,
     dbl:function(){
      this.val *=2;
      val *=2;
        console.log(val)   
        console.log(this.val)
        console.log(this)    //4 4 window
     }
    }
    var func = obj.dbl;
     func();   //func  this window 
    

    まとめ:1.一般関数のthisはwindow 2を指す.dom要素がバインドされたイベントのthisは要素3を指す.タイマーのthisはwindow(ES 6)4を指す.オブジェクト内のthisはオブジェクト自体を指します
    矢印関数のthisは明日補完します
    矢印関数this
  • は、関数が存在するオブジェクトを定義し、実行時が存在しないオブジェクト
  • を定義する.
  • argumentsがなくて、...で代わります.矢印関数は、コンストラクション関数
  • では使用できません.