On dit que le recrutement sur le campus d'Alibaba cette année comporte une question qui teste un point de connaissance, à savoir le pointeur this dans la fonction paramètre de setInterval.
Quand j'ai vu cette question, j'étais confus parce que je n'avais pas résolu le problème à ce moment-là. J'y ai réfléchi pendant longtemps et je n'ai pas pu le comprendre. Ensuite, j'ai vérifié en ligne et j'ai découvert sur un site Web étranger que le problème était survenu. la portée des fonctions après setInterval et setTimeout est globale, c'est-à-dire qu'elle pointe vers l'objet global.
Ce problème est gênant. J'utilise souvent ceci pour faire référence à l'objet actuel dans la fonction de boucle. Vous pensez peut-être à utiliser des fermetures, mais la situation réelle n'est pas si simple. Lorsqu'il y a trop d'instances d'objet, les fermetures deviennent compliquées.
Mon souhait est que cela dans la fonction de boucle pointe toujours vers l'objet du contexte actuel, sans passer de paramètres ni de fermeture (en fait, c'est aussi une fermeture, mais sa forme semble plus naturelle) ;
Par exemple : (Une partie du code est utilisée pour envoyer des requêtes régulièrement)
1 variable sendRequest=function(){}
2 sendRequest.prototype={
3........................................
4 .................................
5 commencerEnvoyer:fonction(){
6 //Faites en sorte que la fonction de boucle pointe vers cet objet au lieu de l'objet global
7 this.loop_send=setInterval((function(param){
8 return function(){param.sendARequest();}
9 })(this),this.options.interval);
10},
11 sendARequest:fonction(){
12 ceci.num++;
13 this.checkLimit();
14 rappel de variable = {
15 succès : this.handleSuccess,
16 échec : this.handleFail,
17 argument : {
18 poignée: ceci,
19 délai d'attente : 500
20}
vingt-et-un }
22var post_data="...."
23 //Si les données à envoyer ne sont pas vides, une donnée sera extraite et envoyée en arrière-plan
24 si(this.data_wait_for_send.length!=0){
25 pour(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 //débogage (post_data)
31 variable que = Connect.asyncRequest('POST', this.options.getUrl, callback,post_data);
32},
33........................
34........................
35}
36
-