[2016-09-21]JavaScript-this理解
4727 ワード
1.グローバルオブジェクト
1
2
3
4
5
コンストラクタは最初の文字を大文字にすると約束していますが、newで呼び出したときだけコンストラクタを計算します.そうでないと、普通の関数とは違いません.newでコンストラクタを呼び出します.thisは生成されたオブジェクトにバインドされます.
call関数とappy関数の違いはパラメータが違っています.二つの方法はthisバインディングのオブジェクトを変えられます.
call(obj、param 1、param 2…);
apply(obj、[]/*params[]パラメータ配列*/)
解決方法の約束はthatでthisの代わりにします.
1
2
3
4
5
function
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