¿Invocar la función de Javascript con un argumento a través del puntero?

¿Cómo se puede invocar una función en Javascript, mientras se pasan argumentos, usando un puntero de función?

Ejemplo:

function foo (a, callback) {    
        jQuery.post('/soon/check.json', { var:a }, function(resp) {
             callback(resp);
    }); 
}

function process_json(resp) {
  // Do something with resp
}

foo(bar, process_json);

"process_json" nunca se invoca. Mirando en Firebug, la cadena "process_json" se pasa a "foo", pero asumí que esto representa un puntero a la función "process_json".

En Javascript, ¿no es posible invocar funciones a través de punteros y pasar argumentos?

preguntado el 16 de mayo de 11 a las 19:05

No hay razón para envolver callback en una función anónima. $.post('/soon/check.json', {var : a}, callback) debería funcionar igual de bien. -

¿Estás seguro de que la llamada ajax se realizó correctamente? Si hubo un error, su devolución de llamada no será recibida. -

La devolución de llamada de jQuery.post toma tres parámetros, el segundo de los cuales es un mensaje de texto que describe el estado de la solicitud. Hacer llamadas AJAX sin comprobar que la solicitud se realizó correctamente y el resultado es válido es una práctica de programación muy mala. -

@Rob la devolución de llamada a $.post() solo se invoca en caso de éxito. -

rubor Ouch, tienes razón. Entonces, OP necesitaría refactorizar para considerar eventos. -

4 Respuestas

En Javascript, ¿no es posible invocar funciones a través de punteros y pasar argumentos?

Ciertamente es posible hacer esto. Todo lo relacionado con tu código me parece bien. ¿Estás seguro de que el $.post() ¿Se está llamando a la devolución de llamada (la función anónima)? Es bar indefinido cuando foo se invoca?

Para aclarar, necesitamos invocar una función usando una cadena, no un puntero de función. es posible?

Si. Si la función se define globalmente, puede invocarla como una propiedad en el window objeto, así:

function foo () { /* snip */ }

var fn_name = 'foo';

window.foo();       // works
window['foo']();    // works
window[fn_name]();  // also works

contestado el 17 de mayo de 11 a las 01:05

La barra está definida. Sí, se está llamando a jQuery.post (). Este error también nos confunde. La única otra cosa que no se menciona es foo y process_json están en diferentes archivos javascript, pero process_json está disponible para foo (un archivo javascript se incluye en la página donde vive foo, y process_json es donde vive este archivo). - Crashalot

@Crash: ¿el real $.post pass { var:a }? Esa voluntad que probar definitivamente romper cosas porque var es una palabra clave. - Matt Ball

Lo siento, soy un idiota. Estábamos pasando una cadena en lugar del puntero de función ... Eliminaría esta pregunta porque es demasiado estúpido permanecer en SO, pero siento que debería otorgar puntos a alguien. Perdón por la pérdida de tiempo, jaja. - Crashalot

Para aclarar, necesitamos invocar una función usando una cadena, no un puntero de función. es posible? - Crashalot

var process_json = function(resp) {
  // Do something with resp
}

contestado el 16 de mayo de 11 a las 23:05

Prueba esto: http://jsfiddle.net/26naf/

Función alert se pasa a foo por referencia:

function foo(fref)
{
   fref("hi world");
}

foo(alert);

Y funciona como ves.

contestado el 17 de mayo de 11 a las 00:05

jejeje si, pero no de la misma manera. y el OP está pasando una cadena "alert" no el literal alert - Naftali alias Neal

c-smile es correcto. Pasamos un puntero de función, no una cadena. Pero por alguna razón parece una cadena en Firebug (aunque tal vez no miramos con atención a Firebug). Definitivamente no estamos pasando (deliberadamente) una cadena. Solo el puntero de función. - Crashalot

@Neal no, no creo que el OP esté pasando una cadena. - Matt Ball

@MattBall - cito: " the string "process_json" is getting passed into "foo,"" - Naftali alias Neal

Lo siento, soy un idiota. Estábamos pasando una cadena en lugar del puntero de función ... Eliminaría esta pregunta porque es demasiado estúpido permanecer en SO, pero siento que debería otorgar puntos a alguien. Perdón por la pérdida de tiempo, jaja. - Crashalot

Por supuesto, puede pasar funciones como devoluciones de llamada, de hecho haciendo

jQuery.post('/soon/check.json', { var:a }, function(resp) {...

Estás pasando una devolución de llamada que se llamará después de la publicación.

Entonces el problema está en otra parte. ¿Se pasa la función anónima a $.post realmente llamado?

Espero que esto ayude

contestado el 17 de mayo de 11 a las 00:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.