jsの中のthis

4253 ワード

js中のthis(6週目)
thisは多くのプログラミング言語のキーワードです.JavaScriptでは、一般的にthis:thisの指向は関数定義の時には確定できません.関数実行時にのみ、thisが誰を指しているのかを確認できます.実際には、thisの最終的な方向はその呼び出しの対象です.
thisが指す場合、関数の呼び出しの仕方によっては、どのようなものがありますか?
  • は、関数名()によって直接呼び出された:thisは、window
  • を指す.
  • オブジェクト・関数名()によって呼び出された:thisはこのオブジェクトを指す;
  • 関数は、配列の要素として、配列下で呼び出された:thisは、この配列
  • を指す.
  • 関数がwindow内蔵関数のコールバック関数として呼び出された時:thisはwindow.setTimeout(func,Xms)を指します.set Interval(func,Xms)などの
  • 関数を構成関数として、newキーワードで呼び出す場合:thisはnewからの新しいオブジェクト
  • を指します.
  • 関数で指定し、appy()\call()\bind()でthis
  • を指定します.
  • 矢印関数のthis問題は、実行時のthisではなく定義時のthisを指します.
    1.関数名()で直接呼び出す:thisはwindowを指します.
  • シーン1(関数名ダイレクトコール)
  •  
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
     myobj();//    window.myobj();
    
    関数実行中にthisが指すのは関数自体ではなく、そのオブジェクトを呼び出すことです.ブラウザのグローバル変数はwindowなので、ここのthisはwindowを指します.もちろんwindow.mynmmeはundifinedです.
    2.オブジェクト・関数名()で呼び出した:thisはこのオブジェクトを指します.
  • シーン二(オブジェクト・関数名呼び出し)
  •  var myname = "  window name";
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
     var a = {
         fun:myobj, //   myobj    a.fun
         myname:"  a name"
     };
     myobj();
     a.fun();
    
    直接mybjを呼び出します実はwindow.mybbojですから、mybbojを呼び出すのはグローバルwindowです.ここのthisはwindowを指します.mybjをaオブジェクトのfun属性に割り当てた後、a.fun()を呼び出します.つまり、aはmyboj()を呼び出します.だから、thisはaを指します.
  • シーン3(オブジェクト・オブジェクト・関数名コール)
  •  var myname = "  window name"
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
     var a = {
         myname:"  a name",
         fun:myobj,
         b:{
             myname:"  b name",
             fun:myobj
         }
    }
    myobj();
    a.fun();
    a.b.fun();
    
    ここでは何も言うことはありません.オブジェクトがマルチレベルネスティングされています.thisはそのオブジェクトを呼び出します.すなわち、関数の前のレベルのオブジェクトです.
  • シーン4(関数名直接呼び出し変数)
  •  var myname = "  window name";
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
     var a = {
         fun:myobj, //   myobj    a.fun
         myname:"  a name"
     };
     a.fun();
     var b = a.fun;
     b();
    
    ここの現象はおかしいようです.私の個人的な理解方法は下の図を見てください.
    3.関数は配列の要素として、配列下で呼び出されました.thisはこの配列を指します.
  • シーン5(配列下付きコール)
  •   var myname = "  window name";
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
         console.log(this[0].myname);//     0   myname  
     }
     var myarr = [{myname:"  myarr[0] name"},myobj];//       
     myarr.myname = "  myarr name";//       myname  
     myarr[1]();//          
    
    4.関数がwindow内蔵関数のコールバック関数として使用される場合:thisはwindow.setTimeout(func,Xms)を指す.set Interval(func,Xms)など
  • シーン六(window内蔵関数コール)
  • var myname = "  window name";
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
      setTimeout(() => {
       myobj();
     }, 1000);
    
    5.関数を構造関数として、newキーワードで呼び出す時:thisはnewからの新しいオブジェクトを指します.
  • シーン7(構造関数としてnewキーワードコール)
  • var myname = "  window name";
     function Myobj(){  //           
         this.myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
     var mobj = new Myobj();
    
    関数がreturnと書かれていない場合、システムは黙々と関数の最後にreturn undefinedを追加します.newキーワードの呼び出し関数は、return undefinedを無視します.(自分で書いたreturn undefinedも無視されます.)newキーワードの呼び出しはreturnを書いていません.(またはreturn undefinedと書いています.)関数は関数の最後に黙々としてreturn thisを入れます.
    6.関数で指定し、appy()\call()\bind()でthisを指定します.
  • シーン8(関数でthisを指定)
  •  var myname = "  window name";
     function myobj(){
         var myname = "     ";
         console.log(this);
         console.log(this.myname);
     }
     var a = {
         myname:"  a name"
     };
     myobj.apply(a);
    
    7.矢印関数のthis問題は、実行時のthisではなく定義時のthisを指します.
    矢印関数のthisは、次の分析では、20180901では広く発揮されませんでした.