Pregunta

Hola tengo este código aquí: http://pastie.org/534470

Y en la línea 109 me sale un error diciendo "TypeError:. El resultado de la expresión 'this.allVarsDefined' [Indefinido] no es una función"

Alcance en javascript es confuso para mí. ¿Alguien puede ver cuál es mi problema? También se conocen ustedes de cualesquiera artículos que ayuden a aprender sobre el alcance en javascript. Esta es la primera vez que realmente usando JS:)

¿Fue útil?

Solución

Esto parece basado en prototipos. Es probable que tenga que configurar su función de notificación de esta manera:

setTimeout(this.notify.bind(this), 5000, track);

modo que la función notificar se enlaza con el objeto Scrobbler y se this establece en el objeto Scrobbler lugar del evento desencadenante la función cuando se produce el tiempo de espera.

Si estoy equivocado en que el uso de prototipo, es probable que pueda lograr el mismo efecto utilizando

var that = this;
setTimeout( function() { that.notify(); }, 5000, track );

Otros consejos

Trate de cambiar la línea 109 desde

setTimeout(this.notify, 5000, track);

a

setTimeout(function(){this.notify()}, 5000, track);

Lo que esto hará es crear un "cierre" (function () {this.notify ()}) que incluye el "este" variable en ella, y "este" incluye this.allVarsDefined, por lo que debe dejar de recibir ese error .

Creo que el problema con el código antiguo es que cuando se escribe "this.notify" se acaba de tirar de la función de la instancia del objeto y pasarlo a setTimeout, pero que no estaban pasando ninguna información sobre el objeto sí mismo. Eso estaría bien si la función de notificar no se refirió a "este", pero ya que hace referencia a "este", es necesario utilizar un cierre.

Se podría beneficiarse de leer más acerca de los cierres de Javascript. Aquí es un artículo decente . También recomiendo el gran libro Java Script: La guía definitiva 5ª Edición por O'Reilly. Sólo cuesta $ 50, pero como es bien escrito y le ayudará enormemente si usted está tratando de escribir una aplicación web en javascript.

Si mi solución no funciona, entonces simplificar el código abajo a lo más básico que usted piensa que debería funcionar y no funciona, y luego publicar aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top