2011-05-03 37 views
5

Tengo el siguiente JS:Cómo llamar a this.function dentro de setTimeout en JS?

function TrackTime() { 

    this.CountBack = function(secs) { 
     setTimeout(function(){this.CountBack(secs)}, SetTimeOutPeriod); 
    } 

} 

He intentado esto con un cierre (visto anteriormente) y también una docena de otras maneras. Parece que no puedo hacer que esto funcione en ningún navegador. La función setTimeout funciona bien cuando no se llama en una función de "clase". ¿Puede alguien ayudarme con esto?

Respuesta

9

Esto sucede debido a que el cambio en el ámbito de "esto" cuando se ejecuta la función.

Trate de que este truco-..

function TrackTime() { 
     this.CountBack = function(secs) {   
      var that = this; 

      setTimeout(function(){that.CountBack(secs)}, SetTimeOutPeriod);  
     }; 
    } 
+0

Gracias, trabajado como un encanto. – Josh

0

Usted podría intentar esto:

var that = this; 
this.CountBack = function (secs) { 
    setTimeout(function() {that.CountBack(secs)}, SetTimeOutPeriod); 
} 
0

La razón de su no es capaz de utilizar cierres aquí es porque setTimeout se sale del objeto de la ventana, por lo que 'esto' es siempre 'ventana'. Deseará utilizar aquí una aplicación de función parcial para establecer el contexto (y opcionalmente algunos parámetros predefinidos) de su función mientras lo mantiene como referencia, por lo que se puede utilizar como controlador de eventos. Neat eh? Vea abajo.

// This will call a function using a reference with predefined arguments. 
function partial(func, context /*, 0..n args */) { 
    var args = Array.prototype.slice.call(arguments, 2); 
    return function() { 
    var allArguments = args.concat(Array.prototype.slice.call(arguments)); 
    return func.apply(context ? context : this, allArguments); 
    }; 
} 
Cuestiones relacionadas