Передача переменной НЕ работает - значение Undefined - PullRequest
0 голосов
/ 09 марта 2012

У меня серьезная проблема, которую я пытался отлаживать уже несколько дней. У меня есть скрипт, который получает текущую широту и долготу пользователей, а затем сохраняет их в переменных. однако, когда я пытаюсь использовать эти переменные вне этой функции и в зоне карты // init, карта просто не отображается. предупредив переменные, я вижу, что за пределами переменных функции положения установлено значение «Не определено». вот мой код:

//main function here
function initialize() {
var lat;
var lon;

//check if user has geo feature
if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(
//get position
function(position){
    lat = position.coords.latitude;
    lon = position.coords.longitude;
    },
// if there was an error
function(error){
    alert('ouch');
});
}
//case the users browser doesn't support geolocations
else {
alert("Your browser doesn't support geolocations, please consider downloading Google Chrome");
}
//init map
var myOptions = {
    center: new google.maps.LatLng(lat, lon),
    zoom: 16,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };
var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

}

Спасибо за любую помощь, Ариэль

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Это потому, что вы объявляете свои переменные внутри функции. Переменные становятся приватными для функции initialize и доступны только изнутри. Если вам нужно иметь доступ к вашим переменным вне функции инициализации, то переместите объявление переменной из функции.

var lat;
var lon;
function initialize() {
...

Взгляните на эту статью MDN о переменной области действия в JavaScript.

UPDATE

Повторно просматривая код, я понимаю, что проблема не в переменной области, запуталась в отступе. Я не знаком с API геолокации, но полагаю, что проблема может заключаться в том, что navigator.geolocation.getCurrentPosition() является асинхронным, поскольку ему придется ждать, пока пользователь разрешит веб-сайту определить местоположение устройства. Поэтому myOptions будет назначено до того, как будет получена фактическая позиция - таким образом, lat & lng все еще не определены, когда назначено myOptions.

Попробуйте вместо этого:

//main function here
function initialize() {
var lat, lon, map, myOptions;

//check if user has geo feature
if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(
//get position
function(position){
    lat = position.coords.latitude;
    lon = position.coords.longitude;

    //init map
    myOptions = {
       center: new google.maps.LatLng(lat, lon),
       zoom: 16,
       mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
},
// if there was an error
function(error){
    alert('ouch');
});
}
//case the users browser doesn't support geolocations
else {
alert("Your browser doesn't support geolocations, please consider downloading Google Chrome");
}
}
0 голосов
/ 09 марта 2012

Больше исправлений на другой ответ. Вопрос scope не актуален. Как определено в исходном коде lat и lon находятся в области действия в контексте, к которому автор вопроса использует alert.

Вот работающий пример, который доказывает это.

function getPos( f ) {
    var position = new Object();
    position.coords = new Object();
    position.coords.latitude = 5;
    position.coords.longitude = 10;
    f( position );          
}


function initialize() {
    var lat;
    var lon;
    getPos(

        function(position){
            lat = position.coords.latitude;
            lon = position.coords.longitude;
            }

            );

       alert( lat + " " + lon );

}


initialize(); //expected 5 & 10

В любом случае, это не похоже на проблему с JS. Похоже, это проблема с любым API Google, который вы используете. Этот вопрос должен был быть помечен как таковой, так как я не знаю ни этого API, ни того, правильно вы его называете или нет.

...