setTimeout y el elusivo "esto" en JavaScript
Al utilizar la función setTimeout, los desarrolladores a menudo encuentran un problema en el que las llamadas posteriores a métodos pierden su contexto previsto, lo que resulta en métodos aparentemente indefinidos. Esto generalmente se debe a la pérdida de la referencia "esta".
El problema:
Considere el siguiente código:
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 1) { return document.images[i]; } } };
En la carga inicial de la página, la función método2 funciona según lo previsto. Sin embargo, después de configurar el tiempo de espera, las llamadas posteriores al método 2 generan un error que indica que no está definido.
La solución:
El problema principal radica en la forma en que setTimeout maneja la palabra clave esta. Al configurar un tiempo de espera usando setTimeout(this.method, 5000), el contexto se pierde, lo que genera el error.
Una solución inteligente a este problema es usar el método bind(). Al agregar ".bind(this)" al final de la llamada al método, el contexto se puede vincular explícitamente, asegurando que se mantenga la referencia correcta a "this" incluso después del tiempo de espera.
Código mejorado :
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.bind(this), 5000); // ^^^^^^^^^^^ <- fix context };
Con esta modificación, el contexto de "esto" está vinculado correctamente, lo que permite que el método 2 continúe funcionando según lo previsto después de que expire el tiempo de espera. Este enfoque es elegante y eficaz a la hora de preservar el contexto de ejecución correcto.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3