[2016-09-21]JavaScript-this理解

4727 ワード

1.グローバルオブジェクト       
1
2
3
4
5function  globalTest(name){     this.name=name; } globalTest('tree'); console.log(name);//tree, name, 2.自分で定義したオブジェクト    
var subway={
     name:'1  ',
     speed:0,
     run:function(speed){
         this.speed=speed;
     }
 };
 subway.run(100);
 console.log(subway.speed); //100,this     subway
  3.コンストラクタで生成したオブジェクト
        コンストラクタは最初の文字を大文字にすると約束していますが、newで呼び出したときだけコンストラクタを計算します.そうでないと、普通の関数とは違いません.newでコンストラクタを呼び出します.thisは生成されたオブジェクトにバインドされます.   
function Subway(speed){
     this.speed=speed;
 }
 var s=new Subway(100);
 console.log(s.speed);//100;this         
4.指定されたオブジェクトは、callまたはappyでバインディングされます.
 call関数とappy関数の違いはパラメータが違っています.二つの方法はthisバインディングのオブジェクトを変えられます.
call(obj、param 1、param 2…);
apply(obj、[]/*params[]パラメータ配列*/)
function Subway(name){
     this.name=name;
     this.speed=0;
     this.run=function(speed){
      this.speed=speed;
     };
 }
 var s=new Subway('1  ');
 s.run(300);
 console.log('      :',s.speed);//300;this         svar s1=new Subway('2  ');
 s.run.apply(s1,[100]);
 console.log('      :',s1.speed);//100;this     s1
 s.run.call(s1,200);
 console.log('      :',s1.speed);//200;this     s1
javascriptは設計上の欠陥があります.
 
var subway={
     name:'1  ',
     speed:0,
     run:function(speed){
         this.speed=speed;  //       function test(speed){
             this.speed=speed+50;//         }
         test(speed);
     }
 };
 subway.run(100);
 console.log(subway.speed);//100
 console.log(speed);//150
 
解決方法の約束はthatでthisの代わりにします.
var subway={
     name:'1  ',
     speed:0,
     run:function(speed){
         var that=this;   // that  thisthis.speed=speed;
         function test(speed){
             that.speed=speed+50;
         }
         test(speed);
     }
 };
 subway.run(100);
 console.log(subway.speed);//150