Tengo un método que utiliza el setTimeout
función y hace una llamada a otro método. En la carga inicial de método 2 funciona bien. Sin embargo, después de que el tiempo de espera, me sale un error que dice method2
es indefinido. ¿Qué estoy haciendo mal aquí?
ex:
test.prototype.method = function()
{
//method2 returns image based on the id passed
this.method2('useSomeElement').src = "http://www.some.url";
timeDelay = window.setTimeout(this.method, 5000);
};
test.prototype.method2 = function(name) {
for (var i = 0; i < document.images.length; i++) {
if (document.images[i].id.indexOf(name) > 1) {
return document.images[i];
}
}
};
- Sólo para asegurarse de que: es «finction» sólo un error en la pregunta, o es que en el código también?
- por favor, añadir a la definición y alcance de method2
- Lo siento, es un error de la
- prueba.el prototipo.method2 = function(nombre) { for (var i = 0; i < documento.imágenes.longitud; i++) { if (document.images[i].id.indexOf(nombre) > 1) { return documento.images[i]; } } }; Espero que esto ayude
- Gracias crescentfresh, lo siento, no tenía la intención de eliminar esa «T»
- ESTA en javascript se explica aquí scotch.io/@alZami/understanding-this-in-javascript
- Posibles duplicados de Cómo acceder a la correcta `esta` dentro de una devolución de llamada?
El problema es que
setTimeout()
causas de javascript para utilizar en el ámbito global. Esencialmente, usted está llamando a lamethod()
clase, pero no dethis
. En lugar de sólo estás diciendosetTimeout
utilizar la funciónmethod
, con ningún ámbito concreto.Para solucionar esto puedes envolver la llamada a la función en otra función llamada que hace referencia a las variables correctas. Se verá algo como esto:
that
puede serthis
porquecallMethod()
es en el método de su ámbito.Este problema se vuelve más complejo cuando usted necesita para pasar parámetros a la
setTimeout
método, como en IE no soporta más de dos parámetros parasetTimeout
. En el caso de que usted necesita para leer sobre cierres.También, como una nota al margen, te estás preparando para un bucle infinito, ya que
method()
siempre llamamethod()
.Más elegante opción para anexar
.bind(this)
hasta el final de su función. E. g.:Así que la respuesta a la OP de la pregunta podría ser:
la
this
utilizado ensetTimeOut
alcance es a través de sí mismo. Crear unvar "foo = this;"
en el interior de su test.prototype.method
función y usofoo
lugar.en es6 usted puede hacer esto de esta
Sí, al cortar el
this.method
de su propietario y pasar a la función sólo parasetTimeout
, se pierde la asociación que establecethis
, asíthis
enmethod()
es igual a la de objeto globalwindow
.Ver esta respuesta para una explicación de la manera sorprendente
this
realmente funciona en JavaScript.