JavaScriptにおけるthisの原理と6つのよくある使用シーンの詳細
3942 ワード
一、thisの原理
thisはJavaScriptのキーワードで、関数が呼び出された時に現れます。
関数は一定の環境で動作しますので、関数を呼び出す時は必ず「誰が呼び出したのか」を知る必要があります。thisを使って指し示します。
では、thisはいったい何を指していますか?
thisは関数自体を指すのではなく、関数の動作領域を指すのではなく、関数を呼び出した時のオブジェクトです。
二、使用シーン
(一)一般関数の呼び出しは、thisがWindowを指しています。
var name = ' ';
function cat(){
var name = ' ';
console.log(this.name);//
console.log(this);//Window {frames: Window, postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, …}
}
cat();
ここで質問があるかもしれませんが、thisは関数を呼び出す対象を指しているのではないですか?cat()は対象が現れていません。これは全体的な作用領域の中で、windowはルートディレクトリです。一般的には省略できます。例えば、alert()はwindow.alert()です。(二)対象の方法、thisとは、当該オブジェクトのことです。
1、ドメインチェーンを一層作用させる場合、thisは当該オブジェクトを指す。
var name = ' ';
var cat = {
name:' ',
eat:function(){
console.log(this.name);//
}
}
cat.eat();
関数eatはcatの対象で呼び出されるので、thisはcat自体を指すので、cat.name=魚があります。2、多重層がドメインチェーンを作用する時、thisは方法の一番近い層の対象を指します。
var name = ' ';
var cat = {
name:' ',
eat1:{
name:' ',
eat2:function(){
console.log(this.name);//
}
}
}
cat.eat1.eat2();
eat 2方法は2つの対象cat、eat 1に含まれていますが、隣接しているeat 1の対象となりますので、this.nameとは、eat 1の属性nameのことです。すなわち「毎年」です。ここで注意したいのですが、もしcat.eat 1.eat 2という結果が変数eat 3に与えられたら、eat 3()の値はいくらですか?
var eat3 = cat.eat1.eat2;
eat3(); //
答えは「カカ」です。これは赋価操作を経て、関数の呼び出しを発起していません。eat 3()これは本物の呼び出しです。これを発起したのはルートオブジェクトwindowです。だから、thisとはwindow、this.name=カカです。(三)コンストラクタの呼び出しは、thisとは、実用化された新しいオブジェクトのことです。
var name = ' ';
function Cat(){
this.name = ' ';
this.type = ' ';
}
var cat1 = new Cat();
console.log(cat1);// Cat {name: " ", type: " "}
console.log(cat1.name);//
(四)applyとcall呼び出し時、thisはパラメータ中のオブジェクトを指します。
var name = ' ';
function eat(){
console.log(this.name);
}
var cat = {
name:' ',
}
var dog = {
name:' ',
}
eat.call(cat);//
eat.call(dog);//
apply方法とcall方法は、明示的な修正プロトタイプの原型に相当します。(五)匿名関数呼び出しは、グローバルオブジェクトを指します。
var name = ' ';
var cat = {
name:' ',
eat:(function(){
console.log(this.name);//
})()
}
cat.eat;
ここで匿名関数の呼び出し方法を紹介します。一般的な方法は3つあります。
//① () , ( )
(function(data){
console.log(data);
})("222");
//② ( ), ()
(function(data){
console.log(data);
}("333"));
//③ , !
!function(data){
console.log(data);
}("444");
(六)タイマーで呼び出し、グローバル変数を指します。一般的なタイマーはset Intervalとset Timeoutがあり、set Intervalを例に挙げている:
var name = ' ';
var cat = setInterval(function(){
var name = ' ';
console.log(this.name);//
clearInterval(cat);
},500);
実はタイマーの本質は、匿名関数の形でもある。まとめ:
①一般関数の呼び出しは、windowを指します。
②対象方法の呼び出しは、thisとは、当該オブジェクトのことであり、かつ最も近いオブジェクトのことである。
③コンストラクタの呼び出し、thisとは、実用化された新しいオブジェクトのことです。
④appyとcall呼び出し、thisはパラメータの対象を指します。
⑤匿名関数の呼び出しは、thisがグローバルオブジェクトwindowを指しています。
⑥タイマーからの呼び出しは、グローバル変数windowを指します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。