2011-05-08 14 views
5

Estoy tratando de ser un buen ciudadano y mantenerme fuera del alcance global como sea posible. ¿Hay alguna manera de acceder a las variables de setTimeout que no están en el alcance global?Javascript: ¿Cómo borrar un SetTimeout no global (cerrado)?

Así que, en este ejemplo, ¿cómo alguien cancelar 'temporizador'?

myObject.timedAction = (function(){ 
    var timer; 
     return function(){ 
      // do stuff 

      // then wait & repeat  
      timer = setTimeout(myObject.timedAction,1000); 
     }; 
})(); 

He intentado clearTimeout(myObject.timedAction.timer,1000); (sin éxito), y no está seguro de qué más probar.

Respuesta

4

No se puede menos que tenga una referencia a timer, que no lo hace porque se declara como una variable en un ámbito. Puede hacer algo como:

myObject.timedAction = (function(){ 
    return function(){ 
     // do stuff 

     // then wait & repeat  
     myObject.timedAction.timer = setTimeout(myObject.timedAction,1000); 
    }; 
})(); 

clearTimeout(myObject.timedAction.timer); 

Tenga en cuenta que el código anterior solo permitirá UN temporizador. Si necesita referencias a más de un temporizador, necesita ser ajustado.

3

El punto es que las variables internas son privadas, y de difícil acceso al mundo exterior. Así que tiene que cambiar su enfoque un poco:

myObject.timedAction = (function(){ 
    var timer; 
    var result = function(){ 
     // do stuff 
     // then wait & repeat  
     timer = setTimeout(myObject.timedAction,1000); 
    }; 

    result.cancel = function() { 
     clearTimeout(timer); 
    }; 

    return result; 
})(); 

myObject.timedAction();  // start it 
myObject.timedAction.cancel() // end it 

Por lo tanto, ahora el temporizador solo se puede acceder desde el interior del cierre. Y sí, puedes agregar métodos a una función, porque JS es increíble.

+1

Wow, "método" y "función" en la misma frase. –

+0

@TomalakGeretkai recuerda que una función hereda de 'Object'. Entonces es solo un objeto. – Raynos

1

colocar el mango temporizador en una propiedad en su objeto:

myObject.timedAction = function(){ 
    // do stuff 
    // then wait & repeat 
    this.timer = window.setTimeout(function(){ myObject.timedAction(); },1000); 
}; 

en cuenta que debe envolver la llamada del temporizador en una función, por lo que se llama como un método de su objeto en lugar de como una función global, de lo contrario no podrá acceder a su objeto usando this.

Ahora puede detener el temporizador usando:

window.clearTimeout(myObject.timer); 
Cuestiones relacionadas