entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Se ejecuta 2 veces la misma función en jquery

Hola a todos, tengo un problema con jquery. Tengo 2 archivos js, pongamos index.js y otro.js

Bien, en index.js tengo un contador que según en qué número está va llamando a una función con el mismo número, por ejemplo:

$(function() {  
window.control=function control(){      
var nombreFuncion="video"; 
var cont=1;

var tipo1 = nombreFuncion+cont+"();";
var tipo2 = eval(tipo1);
tipo2;
cont++;

});

Así llamo a video1(); y sumo 1 para llamar a video2 la siguiente vez que entre.

Dentro de video1(); tengo puesto que vuelva a llamar a la función control pero cuando debería entrar por video2(); lo que hace es ejecutar otra vez video1(); y luego video2();

Alguien sabe el por qué? Me vale si se puede borrar una función después de llamarla.
Gracias y un saludo.

1 Respuesta

4votos

white Puntos75880

Hola @torechenko, te comento los errores que veo en tú código:

Este es un clasico problema de ambito de variables, pero lejos esta esto de ser el problema en tú código sino que hay varios errores.

  • cont es una variable local en tu closure, es por eso que no funcionará el valor sigue estando en 1
  • tú actualizas el valor de cont al final del closure, que es lo que sucede? haces un loop en la linea:
    var tipo2 = eval(tipo1); esto no permite que vaya al final de la función y incremente el valor de cont
  • No es necesario nombrar una funcion cuando vas a definir una variable con esta.
  • usar eval es considerado una mala práctica, evita en lo posible usar esta función, en su lugar puedes usar valores intermedios, por ejemplo window[nombre_de_funcion](); donde nombre_funcion es una variable con una cadena.

para el punto 2 una descripción gráfica:

     window.control = function() {    <-------- |
          var tipo1 = nombreFuncion+cont+"();";  |
          var tipo2 = eval(tipo1); -----------v  |
          cont++;    // nunca llega aqui      |  |
     }                                        |  |
                                              |  |
      function video1() {    <--------------|  |
          window.control(); ----------------------
      }

te propongo este código:

    var count = 1, nombreFuncion, tipo1;

    function control() {
        nombreFuncion="video";
        tipo1 = window[nombreFuncion + (count++)]();
    }

    control();

    function video1() {
        console.log('video1');
        window.control();
    }

    function video2() {
        console.log('video2');
    }

0voto

torechenko comentado

Muchísimas gracias por la respuesta, me ha servido de gran ayuda, eres un crack!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta