2010-10-15 28 views
14

Mucha gente dice que esto se pedía demasiado en los comentarios, que me hizo atreven a preguntar esto, pero todavía no han encontrado una solución en sus respuestas, sobre todo porque (1) que normalmente están utilizando jQuery y (2) las preguntas generalmente contienen tecnicismos que no entiendo.JavaScript: ¿Es posible pasar una variable a una función de devolución de llamada asignada a una variable?

Tengo una función con una variable dentro. La variable tiene asignada una función. Estoy seguro de que este concepto no es exclusivo de AJAX, pero ese es el contexto en el que lo estoy usando, si hace la diferencia.

function iClick(this) 
{ 
    var foo = "I would like to pass this."; 

    ajax.onreadystatechange = function (foo) { alert(foo); } 
} 

Quiero pasarle una variable a la función. Sin embargo, dado que no hay una declaración de función original, ¿cómo especifico los parámetros? ¿Puedo incluso hacer eso?

+4

+1. Digo preguntar si ha buscado pero no ha encontrado lo que está buscando. Muchos de nosotros venimos de entornos que no son de programación, por lo que algunos matices de la informática e incluso fundamentos a menudo necesitan aclaración (al menos en mi caso). – orolo

Respuesta

18

Simplemente no declarar que la variable como un parámetro en la función anónima, así:

function iClick(this) 
{ 
    var foo = "I would like to pass this."; 
    ajax.onreadystatechange = function() { alert(foo); } 
} 

Al llamar al primer parámetro foo Es lo que es llamando que devolución de llamada pasa por eso es foo dentro de la función . Si desea hacer referencia a una variable previamente declarada simplemente haga eso, asegúrese de no para usar un parámetro con el mismo nombre.

+2

¡Oh! Pensé que estaría fuera de su alcance. ¡Gracias! – Tarik

+3

@Tarik - JS tiene alcance de funciones y cierres. Las funciones tienen acceso a las variables en los ámbitos principales incluso después de que hayan regresado las funciones principales. –

+0

@PeterAjtai ¿Qué pasa si dentro de ajax.onreadystatechage Quiero asignar un nuevo valor a foo. ¿Sería eso visible en iClick()? p.ej. function iClick (this) { var foo = "Me gustaría pasar esto."; ajax.onreadystatechange = function() {foo = "Valor cambiado"; } console.log (foo); // ¿imprimiría esto 'Valor cambiado'? } – Ali

15

Puede crear una función como este resultado

var c="hello"; 

(function(b){ 
    alert(b) 
})(c); 

sería "hola"

+0

esa es la respuesta, y esto es realmente útil cuando desea analizar una variable desde el exterior en una devolución de llamada asíncrona como 'db.query' en nodo por ejemplo –

+1

@ JoãoPimentelFerreira Muy simple de probar. extraño que preguntes? Pero para responder. La variable c sería la que está en el alcance, que es la versión local de la función. –

+1

@ JoãoPimentelFerreira Aquí hay una prueba simple. https://jsfiddle.net/qon4cwhn/ Verás que el valor de c como global no se modifica. –

3

También puede hacer esto, pero tal vez no es necesario:

function iClick(this) 
{ 
    var foo = "I would like to pass this."; 

    ajax.onreadystatechange = (function(thevar) { 
     return function() { alert(thevar); }; 
     })(foo); 
} 
0

Te belive quería algo así

function handleAjaxRequest(params) { 
    var context = {'b':'inner', 'c': params['c']}; 
    function rendered(html) { 
     // render 
    } 
    function gotPart(part) { 
     context['a'] = part; 
     engine.render(context).addCallback(rendered); 
    } 
    ajax.getPart(params).addCallback(gotPart); 
} 
1

Tal como se contempla @ John Hartsock, la respuesta que cada uno debe recordar realmente es este

var c="hello"; 

(function(b){ 
    alert(b) 
})(c); 

Y eso es muy importante, por ejemplo en un bucle for cuando hay alguna función asíncrona dentro de él, porque de lo contrario no obtiene el elemento correcto.

Dime, ¿qué sale de aquí?

for (var i=0; i<5; i++){ 
 
    setTimeout(function(){ 
 
    console.log(i); 
 
    }, 1000); 
 
}

Exactamente: todo 5, porque cuando todos los temporizadores se activan después de 1 segundo, variable de i ya está en el valor 5.

Pero si se utiliza un auto-invocado función anónima (SIAF) como esto

for (var i=0; i<5; i++){ 
 
    (function (j){ 
 
    setTimeout(function(){ 
 
     console.log(j); 
 
     }, 1000); 
 
    })(i); 
 
}

que hace el trabajo, ya que cada vez que se evoca la función, se ejecuta otra instancia de la función y como cualquier función, tiene sus propias variables locales. No solo defino la función, también la ejecuto de inmediato (a través del (); al final), pero internamente se creará una nueva instancia de la función con diferentes variables locales internas, ya que analizo la función con una variable diferente cada vez que lo ejecuto.

Cuestiones relacionadas