Diz-se que o recrutamento do campus do Alibaba este ano tem uma pergunta que testa um ponto de conhecimento, que é o ponteiro this na função de parâmetro de setInterval.
Quando vi essa pergunta fiquei confuso porque não esclareci o problema naquele momento, pensei muito sobre isso e não consegui descobrir. Então verifiquei online e descobri em um site estrangeiro que o. O escopo das funções após setInterval e setTimeout é global, ou seja, este interior aponta para o objeto global.
Esse problema é problemático. Costumo usar isso para me referir ao objeto atual na função de loop. Talvez você pense em usar encerramentos, mas a situação real não é tão simples.
Meu desejo é fazer com que isso na função loop ainda aponte para o objeto do contexto atual, sem passar parâmetros ou fechamento (na verdade, isso também é um fechamento, mas parece mais natural na forma);
Por exemplo: (Parte do código é usada para enviar solicitações regularmente)
1 var sendRequest=função(){}
2 sendRequest.prototype={
3........................................
4 ............................
5 começarEnviar:função(){
6 //Faça isso na função de loop apontar para este objeto em vez do objeto global
7 this.loop_send=setInterval((function(param){
8 return function(){param.sendARequest();}
9 })(this),this.options.interval);
10},
11 sendARequest:função(){
12 isto.num++;
13 this.checkLimit();
Retorno de chamada de 14 var = {
15 sucesso: this.handleSuccess,
16 falha: this.handleFail,
17 argumento: {
18 alça: esta,
19 tempo limite: 500
20}
vinte e um }
22 var post_data="...."
23 //Se os dados a serem enviados não estiverem vazios, um dado será retirado e enviado para segundo plano
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 //depurar(post_data)
31 var que = Connect.asyncRequest('POST', this.options.getUrl, callback,post_data);
32},
33..................................
34.........................
35}
36
-