今年のアリババのキャンパス採用には知識ポイントを問う問題があると言われているが、それがsetIntervalのパラメータ関数のthisポインタだ。
この質問を見たとき、私はその時は問題が解決できずに混乱していましたが、長い間考えましたが、理解できませんでした。その後、オンラインで調べたところ、海外のウェブサイトで次のことを見つけました。 setInterval と setTimeout の後の関数のスコープは global です。つまり、この内部はグローバル オブジェクトを指します。
この問題は厄介です。ループ関数内で現在のオブジェクトを参照するためによく使用します。クロージャを使用することを考えるかもしれませんが、実際の状況はそれほど単純ではありません。オブジェクトのインスタンスが多すぎると、クロージャは煩雑になります。
私の願いは、パラメータやクロージャを渡さずに、ループ関数内でこれが現在のコンテキストのオブジェクトを指すようにすることです(実際、これもクロージャですが、形式的にはより自然に見えます)。
例: (コードの一部はリクエストを定期的に送信するために使用されます)
1 var sendRequest=function(){}
2 sendRequest.prototype={
3................................................................
4 ...................................
5 beginSend:function(){
6 //ループ関数内の this がグローバル オブジェクトではなくこのオブジェクトを指すようにします
7 this.loop_send=setInterval((function(param){
8 return function(){param.sendARequest();}
9 })(this),this.options.interval);
10}、
11 sendARequest:function(){
12 this.num++;
13 this.checkLimit();
14 var コールバック = {
15 成功: this.handleSuccess、
16 失敗: this.handleFail、
17 引数: {
18ハンドル:これ、
19 タイムアウト:500
20}
21 }
22 var post_data="...."
23 //送信するデータが空でない場合は、データを取り出してバックグラウンドに送信します
24 if(this.data_wait_for_send.length!=0){
25 for(var i=0,j=this.data_wait_for_send.length;i<j;i++){
26 post_data+="&content[]="+this.data_wait_for_send[i];
27}
28 this.data_wait_for_send=[]
29 }
30 //デバッグ(post_data)
31 var que = Connect.asyncRequest('POST', this.options.getUrl, callback,post_data);
32}、
33.................................
34.................................
35}
36
-