からコピー: https://stackoverflow.com/a/16063711/1641941
この変数
すべてのサンプル コードthis
で、現在のインスタンスを参照しています。
this 変数は実際には呼び出し元のオブジェクトを参照し、関数の前にあるオブジェクトを参照します。
明確にするために、次のコードを参照してください。
theInvokingObject.thefunction();
これが間違ったオブジェクトを参照するインスタンスは、通常、イベント リスナー、コールバック、またはタイムアウトと間隔をアタッチする場合です。次の 2 行のコードではpass
、関数を呼び出していません。関数の受け渡しは:someObject.aFunction
であり、呼び出しは:someObject.aFunction()
です。値は、関数が宣言されたオブジェクトを参照するのthis
ではなく、関数が宣言されたオブジェクトを参照しますinvokes
。
setTimeout(someObject.aFuncton,100);//this in aFunction is window
somebutton.onclick = someObject.aFunction;//this in aFunction is somebutton
this
上記のケースで someObject を参照するには、関数の代わりにクロージャーを直接渡すことができます。
setTimeout(function(){someObject.aFuncton();},100);
somebutton.onclick = function(){someObject.aFunction();};
クロージャー スコープに含まれる変数を細かく制御できるように、プロトタイプでクロージャーの関数を返す関数を定義するのが好きです。
var Hamster = function(name){
var largeVariable = new Array(100000).join("Hello World");
// if I do
// setInterval(function(){this.checkSleep();},100);
// then largeVariable will be in the closure scope as well
this.name=name
setInterval(this.closures.checkSleep(this),1000);
};
Hamster.prototype.closures={
checkSleep:function(hamsterInstance){
return function(){
console.log(typeof largeVariable);//undefined
console.log(hamsterInstance);//instance of Hamster named Betty
hamsterInstance.checkSleep();
};
}
};
Hamster.prototype.checkSleep=function(){
//do stuff assuming this is the Hamster instance
};
var betty = new Hamster("Betty");