1

Lo que quiero es llamar a la función slider, pero cuando lo hago, me dice que la función no está definida; también está dentro de una función llamada slan que es ejecutada por un mouseenter.
Este es el código:

 $('.slideshow').mouseenter(function slan(e) {

        var id = $(this).attr('slider');
        var slin = $(this).attr('id');
             
        var action = 'Imagenes';
       
        $.ajax({
            url: 'ajax.php',
            type: 'POST',
            async:true,
            data: {action:action,id:id},

            success: function slider(response) {

                
                //console.log(response);

                if (response != 'error') {


                    var info = JSON.parse(response);

                    console.log(info);

                    var slider_id = info.id;
                    
                    return slider_id;
                     
                         
                }

            },

            error: function(error) {

                console.log(error);
            },
                
        });           

 }); 

Estas son las funciones y no sé cómo llamarlas. ¿Qué puedo hacer?

padaleiana
  • 2,175
  • 5
  • 16
  • 24

1 Answers1

3

El problema que tienes es que el nombre que le das a las funciones en tu código no las hace disponibles en ningún lado que no sea dentro de ellas mismas. En este sentido, Javascript es un poco especial. Para entenderlo mejor voy a poner unos ejemplos:

function nombre1 () {
  return "ejecutando nombre1";
} // al definir una función no hace falta punto y coma tras la llave

const nombre2 = function recursiva(n) {
  if (n > 0) {
    return n + recursiva(n-1);
  }
  return 0;
}; // El punto y coma es recomendable porque es el final de una asignación

const nombre3 = function nombreOculto() {
  return m;
};

console.log(nombre1()); //llamando a la función definida
console.log(nombre2(4)); //llamando a la función asignada
try {
  console.log(recursiva(3)); //intentando llamar por su nombre "interno"
} catch (err) {
  console.log(err.stack);
}

// llamando a una función que fallará, para mostrar la pila de llamadas
try {
  nombre3();
} catch (err) {
  console.log(err.stack);
}

Como puedes ver:

  • si definimos una una función mediante una declaración, su nombre nos permite llamarla (el caso de nombre1).
  • si asignamos una función en una expresión, su nombre no lo podemos usar para llamarla desde el contexto actual (el caso de la función recursiva) pero sí la podemos usar dentro de la misma función para llamarla recursivamente. Además es útil en caso de error, porque su nombre sí aparece en caso de error en el stacktrace (caso de nombre3/nombreOculto).

Por tanto, la solución sería declarar las funciones fuera de tu llamada AJAX y usar su nombre fuera:

function slider(response) {...}

function slan(e) {

    var id = $(this).attr('slider');
    var slin = $(this).attr('id');
         
    var action = 'Imagenes';
   
    $.ajax({
        url: 'ajax.php',
        type: 'POST',
        async:true,
        data: {action:action,id:id},
        success: slider,
        error: function(error) {
            console.log(error);
        },
            
    });
 }

 $('.slideshow').mouseenter(slan);
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
  • 1
    Completando la respuesta el OP lo que hizo fue [una funcion de expresion](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/function) y a su vez la se relaciona con la [declaracion de variable](https://es.stackoverflow.com/a/400647/28035) y su [contexto](https://es.stackoverflow.com/questions/135637/contexto-this-en-function-arrow-con-prototype) – JackNavaRow Feb 22 '21 at 17:39
  • no ta curiosa: todas las preguntas las respondistes tu xD – JackNavaRow Feb 22 '21 at 17:40