Se dice que el reclutamiento del campus de Alibaba este año tiene una pregunta que prueba un punto de conocimiento, y ese es el puntero this en la función de parámetro de setInterval.
Cuando vi esta pregunta, me sentí confundido porque no resolví el problema en ese momento. Lo pensé durante mucho tiempo y no pude resolverlo. Luego revisé en línea y encontré en un sitio web extranjero. El alcance de las funciones después de setInterval y setTimeout es global, es decir, este interior apunta al objeto global.
Este problema es problemático. A menudo uso esto para referirme al objeto actual en la función de bucle. Quizás esté pensando en usar cierres, pero la situación real no es tan simple. Cuando hay demasiadas instancias de objetos, los cierres se vuelven complicados.
Mi deseo es hacer que esto en la función de bucle aún apunte al objeto del contexto actual, sin pasar parámetros ni cierre (de hecho, esto también es un cierre, pero su forma parece más natural);
Por ejemplo: (Parte del código se utiliza para enviar solicitudes con regularidad)
1 var enviarRequest=función(){}
2 enviarRequest.prototype={
3....................................
4 .................................
5 comenzarEnviar:función(){
6 //Haga que esto en la función de bucle apunte a este objeto en lugar del objeto global
7 this.loop_send=setInterval((función(parámetro){
8 función de retorno(){param.sendARequest();}
9 })(este),este.intervalo.de.opciones);
10},
11 enviarARequest:función(){
12 este.num++;
13 this.checkLimit();
Devolución de llamada de 14 var = {
15 éxito: this.handleSuccess,
16 falla: this.handleFail,
17 argumento: {
18 mango: esto,
19 tiempo de espera: 500
20}
veintiuno }
22var post_data="...."
23 // Si los datos a enviar no están vacíos, se extraerá un dato y se enviará a segundo plano.
24 si(this.data_wait_for_send.length!=0){
25 para(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
-