Hola,
Esto último que dices sucede porque una llamada async: true, es ejecutada, en el instante de tiempo siguiente se ejecuta la siguiente línea después de la llamada ajax. Como la llamda aún no ha terminado y por lo tanto aún no obtuvo el valor, se devuelve el valor de la variable en ese instante, osea undefined. Luego la llamada termina y sale el alert y asigna el valor, pero para entonces el resto ya se ha ejecutado.
Al no marcarse la llamada como async: false se toma como true por defecto.
Saludos!
Esto último que dices sucede porque una llamada async: true, es ejecutada, en el instante de tiempo siguiente se ejecuta la siguiente línea después de la llamada ajax. Como la llamda aún no ha terminado y por lo tanto aún no obtuvo el valor, se devuelve el valor de la variable en ese instante, osea undefined. Luego la llamada termina y sale el alert y asigna el valor, pero para entonces el resto ya se ha ejecutado.
Al no marcarse la llamada como async: false se toma como true por defecto.
Saludos!