Bienvenido a las bondades de la programación asíncrona donde la linea de código que está abajo no tiene porque ejecutarse después de la que esta arriba. Bien, esto ya pasa al escribir código modularmente con funciones. Tu puedes definir una función en cualquier espacio del código y luego ejecutarla en cualquier otro lugar.
Aquí es un poco diferente. Has usado eventos click? Pues una petición ajax funciona esecialmente como un evento click. Tu no sabes cuando llegara la respuesta ajax o el click del usuario. Por eso cuando escribes código para estos eventos, registras una función que se ejecute cuando el evento deseado se produzca. El código que viene después de la petición ajax o del click no implica que haya llegado la respuesta ajax o se haya habido un click. Y por tanto es normal que no obtengas el valor deseado.
Tu ejemplo cambiando la petición AJAX por un click:
Código Javascript
:
Ver originalvar x = 3;
alert(x);
var x = mifuncion(x,y,z);
alert (x);
function mifuncion(x, y, z) {
var sum;
document.body.onclick = function () {
sum = x + y + z;
}
return sum; // undefined hasta que no se clique. Y cuando se clique con toda probabilidad la función ya se habrá ejecutado
}