El código funciona bien, pero no hace lo que esperas que haga.
En Javascript muchas cosas funcionan de forma asíncrona. Te voy a explicar el proceso que hace tu código:
- Creas las variables de coordenadas.
- Pides la geolocalización del usuario.
- El navegador envíe un mensaje al usuario para saber si este quiere compartir la ubicación. Mientras espera, continúa con la ejecución del código.
- El navegador muestra el alert. Lat aún no está lleno, por lo que muestra 0.
- Cuando el usuario da permiso, se ejecuta la función success, y se llenan las variables con los datos correspondientes.
Lo que realmente pasa es que la función success no se ejecuta en el orden en el que la escribes, sino que funciona de forma asíncrona. Deja a la función en espera hasta que el usuario responda y la función obtenga la geolocalización, y mientras tanto continúa ejecutando el resto del código. Es exactamente el mismo patrón que se usa en peticiones AJAX
Por eso, cuando muestras el alert, la variable Lat aún no se ha llenado. Prueba a ponerlo dentro de la función success.
Código Javascript :
function success(pos) {
console.log('Datos de geolocalización adquiridos.',
'Longitud:', pos.coords.longitude,
'Latitud:', pos.coords.latitude);
}
console.log('Pidiendo Geolocalización...');
navigator.geolocation.getCurrentPosition(success);
Ahora, cuando necesites usar los datos, tienes dos opciones. Puedes comprobar si ya se han guardado los datos, o puedes llamar a la función que los necesita desde dentro de success.
Código Javascript :
function success(pos) {
// La función mostrar_coordenadas muestra las coordenadas en el formulario
mostrar_coordenadas(pos.coords.latitude, pos.coords.longitude);
}
Sobre las variables la mejor práctica es que crees un namespace cuando necesitas tener datos globales, y
siempre usar var para el resto de variables. Por ejemplo así:
Código Javascript :
var App = {};
App.coords = {};
function success(pos) {
var lat = pos.coords.latitude;
var lon = pos.coords.longitude;
App.coords.lat = lat;
App.coords.lon = lon;
}
Así evitas crear otra variable con el mismo nombre en otra parte del código que rompa lo anterior.
Las variables declaradas con var pertenecen a la función en la que se declaran, y no son accesibles desde fuera. Si no usas var para declarar una variable, esta será global y accesible desde cualquier parte de la aplicación. Esto es un problema porque puedes tener otra variable con el mismo nombre en otra parte del código a la que le estás cambiando en valor, y entonces ocurrirán cosas malas. Por eso trata de seguir esa práctica y no habrá confusión.