この質問を見たとき、私はその時は問題が解決できずに混乱していましたが、長い間考えましたが、理解できませんでした。その後、オンラインで調べたところ、海外のウェブサイトで次のことを見つけました。 setInterval と setTimeout の後の関数のスコープは global です。つまり、 this の内部はグローバル オブジェクトを指します。
この問題は、ループ関数内で現在のオブジェクトを参照するためによく使用されます。クロージャを使用していますが、実際の状況はそれほど単純ではありません。オブジェクトのインスタンスが多すぎると、クロージャが乱雑になります。
ループ関数内でこれを渡さずに、現在のコンテキストのオブジェクトを指すようにしたいのです。パラメータまたはクロージャ (実際、これもクロージャですが、形式的にはより自然に見えます);
例: (コードの一部、関数は定期的にリクエストを送信することです)
var sendRequest=function(){}
sendRequest.prototype={
.................................................
................................ .........
beginSend:function() {
//ループ関数内の this がグローバル オブジェクトの代わりにこのオブジェクトを指すようにします
this.loop_send=setInterval((function( param){
return function(){param.sendARequest();}
})(this),this.options.interval);
sendARequest:function(){
this.num ;
this.checkLimit();
var callback = {
成功: this.handleSuccess、
失敗: this.handleFail、
引数: {
ハンドル: this,
timeout:500
}
}
var post_data="...."
//送信するデータが空でない場合、データの一部が取得されます
if(this.data_wait_for_send.length!=0){
for(var i=0,j=this.data_wait_for_send.length;ipost_data ="&content[]=" this.data_wait_for_send[i];
}
this.data_wait_for_send =[]
}
// debug(post_data)
var que = Connect.asyncRequest( 'POST'、this.options.getUrl、コールバック、post_data);
}、
.................................
. ...................
}
このようにして、sendARequest() 関数内で this を使用して参照できます。通常は現在のオブジェクトを参照し、現在のオブジェクトの変数とメソッドを使用するのは非常に便利ではないでしょうか。