Переменная не хочет переопределяться. Почему?
Если хотите использовать асинхронные операции в синхронном стиле, придется прикрутить промисы/** Переписываем с промисами */
function getLoc(options) {
  if (navigator.geolocation ){
    // Запускаем новый промис
    return new Promise((resolve, reject) => {  
      navigator.geolocation.getCurrentPosition((pos) => {
        resolve(pos);
      }, (err) => {
        reject(err);
      }, options);
    });
  } else {
    // Если нет, возвращаем заглушку, или можете сделать "reject"
    return Promise.resolve({
      pos: {
        coords: {
          latitude: 0,
          longitude: 0
        }
      }
    });
  }
}

getLoc()
.then((pos) => {
  const {
    latitude: lat,
    longitude: lon
  } = pos.coords;

  console.log("Wow");
  console.log("So promissed");
  console.log(lat, lon);
})
.catch((err) => {
  // Пользователь отказался давать координаты
  console.log(":(");
  console.error(err);
});
Вероятно вы ожидаете что сразу после getLoc(); у вас будут получены координаты? Это не так.
Посмотрите пример - https://developer.mozilla.org/en-US/docs/Web/API/G...
Вам нужно обработать полученные координаты или тут:var lat = 0, lon = 0;
function getLoc(){
    if(navigator.geolocation){
        navigator.geolocation.getCurrentPosition(function (pos) {
            lat = pos.coords.latitude;
            lon = pos.coords.longitude;
            // тут нужно обработать полученные координаты
        });
    }
}
getLoc();
или как-то иначе, например через setTimeout периодически проверять, появились ли в переменных lat и lon координаты.