JavaScript-thisの値を取る6つの状況
3235 ワード
たくさんのお盆の友達はjsを勉強する時や他の言語の時にthisで頭が痛くなります.今日はJavaScriptの中のthisについて話します.
関数の中でthisはどの値を取るかは、本当に関数が呼び出されて実行されるときに決定され、関数が定義されているときには決定されません.thisの値はコンテキスト環境の一部を実行するので、関数を呼び出すたびに、新しい実行コンテキスト環境が生成されます.
JavaScriptの中で、thisの取得値は全部で六種類ありますが、具体的にはどの六種類ですか?一緒に見に行きましょう.
状況1:コンストラクタ
構造関数とは、newオブジェクトの関数です.厳密には、すべての関数はnewオブジェクトでもいいですが、いくつかの関数の定義はnewオブジェクトのためであり、関数によっては違います.また、コンストラクタの関数名の最初の文字を大文字にします.例えば、Object、Aray、Functなどです.
なお、以上はnew A()の場合のみ、つまりA関数が構造関数として作用する場合である.直接A関数を呼び出すと、new A()ではなく、状況が大きく変わります.
ケース2:関数をオブジェクトとしての属性
関数がオブジェクトの属性である場合、オブジェクトの属性の一つとして呼び出されると、関数のthisがオブジェクトを指します.
このため、コンソールは、Objと10を出力します.
なお、fn関数がobjの属性として呼び出されない場合、どのような結果になりますか?
上記のコードのように、fn関数が他の変数に割り当てられている場合、Objの属性として呼び出されていない場合、thisの値はwindowであり、this.xはundefinedである.
ケース3:関数はcallまたはappyで呼び出す
一つの関数がコールされると、thisの値は、入力されたオブジェクトの値をとります.
状況4:グローバル& 一般関数を呼び出します
全体的な環境の下で、thisは永遠にwindowで、これは非難がないべきです.
ただし、次の場合は注意が必要です.
上のコードの中で、関数fはobj.fnの内部で定義されていますが、相変わらず普通の関数です.thisはまだwindowを指しています.
五、コンストラクタの原型の中のthis
実際には、構造関数のプロトタイプだけでなく、プロトタイプ全体においても、thisは現在のオブジェクトの値を表しています.
六.矢印関数のthis
ES 6では矢印関数のthisが特別です.
矢印関数式の文法は、関数式よりも短く、独自のthis、argments、superまたはnew.targetを結合しない.矢印関数は、そのコンテキストのthis値を自分のthis値として取得します.
つまり矢印関数は自分のthisではなく、作用ドメインチェーンに沿っています. thisの具体的な指差は普通の関数のthisの方向によって判断すればいいです.
はい、以上はthisの出現の6種類の情況で、実は上の情況はすべてひと言で総括を行うことができます:誰の最後の呼び出しの関数、thisは誰を指しますか?
他の状況を発見したり、間違ったところを発見したりしたら、皆さんコメントを歓迎します.一緒に勉強しましょう.
Biu~
関数の中でthisはどの値を取るかは、本当に関数が呼び出されて実行されるときに決定され、関数が定義されているときには決定されません.thisの値はコンテキスト環境の一部を実行するので、関数を呼び出すたびに、新しい実行コンテキスト環境が生成されます.
JavaScriptの中で、thisの取得値は全部で六種類ありますが、具体的にはどの六種類ですか?一緒に見に行きましょう.
状況1:コンストラクタ
構造関数とは、newオブジェクトの関数です.厳密には、すべての関数はnewオブジェクトでもいいですが、いくつかの関数の定義はnewオブジェクトのためであり、関数によっては違います.また、コンストラクタの関数名の最初の文字を大文字にします.例えば、Object、Aray、Functなどです.
function A(){
this.name="Searchin";
this.year=2018;
console.log(this);
}
var f1= new A();
console.log(f1.name);//Searchin
console.log(f1.year);//2018
以上のコードの中で、関数がコンストラクターとして使用されると、その中のthisはnewから出てくるオブジェクトを表します.なお、以上はnew A()の場合のみ、つまりA関数が構造関数として作用する場合である.直接A関数を呼び出すと、new A()ではなく、状況が大きく変わります.
function A(){
this.name='Searhcin';
this.year=2018;
console.log(this);//
}
A();
このような状況の下でthisはwindowです.私たちは後の文で言います.ケース2:関数をオブジェクトとしての属性
関数がオブジェクトの属性である場合、オブジェクトの属性の一つとして呼び出されると、関数のthisがオブジェクトを指します.
var obj={
x:10,
fn:function(){
console.log(this);
console.log(this.x);
}
};
obj.fn();
以上のコードでは、fnはオブジェクトの属性としてだけでなく、オブジェクトの属性として呼び出されます.結果としてthisはobjの対象です.このため、コンソールは、Objと10を出力します.
なお、fn関数がobjの属性として呼び出されない場合、どのような結果になりますか?
var obj={
x:10,
fn:function(){
console.log(this);
console.log(this.x);
}
};
var fn1=obj.fn();
fn1();
上記のコードのように、fn関数が他の変数に割り当てられている場合、Objの属性として呼び出されていない場合、thisの値はwindowであり、this.xはundefinedである.
ケース3:関数はcallまたはappyで呼び出す
一つの関数がコールされると、thisの値は、入力されたオブジェクトの値をとります.
var obj={
x:10;
};
function fn() {
console.log(this);
console.log(this.x);
}
fn.call(obj);
したがって、コンソールは、Objおよび10を出力する.状況4:グローバル& 一般関数を呼び出します
全体的な環境の下で、thisは永遠にwindowで、これは非難がないべきです.
console.log(this===window);//true
普通の関数は呼び出し時に、その中のthisもすべてwindowです.var x=10;
var fn=function(){
console.log(this);//window
console.log(this.x);//10
}
fn();
以上のコードはよく分かります.ただし、次の場合は注意が必要です.
var obj={
x:10;
fn:function(){
function f(){
console.log(this);//window
console.log(this.x);//undefined
}
f();
}
};
obj.fn();
上のコードの中で、関数fはobj.fnの内部で定義されていますが、相変わらず普通の関数です.thisはまだwindowを指しています.
五、コンストラクタの原型の中のthis
function fn(){
this.name = "Searchin";
this.age = 18;
}
fn.prototype.getName = function (){
console.log(this.name);
}
var f1 = mew fn();
f1.getName(); //Searchin
上記のようなコードでは、fn.prototype.get Name関数では、th isがf 1オブジェクトを指しています.したがって、f 1.nameの値は、this.nameを介して取得することができる.実際には、構造関数のプロトタイプだけでなく、プロトタイプ全体においても、thisは現在のオブジェクトの値を表しています.
六.矢印関数のthis
ES 6では矢印関数のthisが特別です.
矢印関数式の文法は、関数式よりも短く、独自のthis、argments、superまたはnew.targetを結合しない.矢印関数は、そのコンテキストのthis値を自分のthis値として取得します.
つまり矢印関数は自分のthisではなく、作用ドメインチェーンに沿っています. thisの具体的な指差は普通の関数のthisの方向によって判断すればいいです.
はい、以上はthisの出現の6種類の情況で、実は上の情況はすべてひと言で総括を行うことができます:誰の最後の呼び出しの関数、thisは誰を指しますか?
他の状況を発見したり、間違ったところを発見したりしたら、皆さんコメントを歓迎します.一緒に勉強しましょう.
Biu~