Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 变量传递无效-未定义值_Javascript_Html_Variables_Geolocation_W3c Geolocation - Fatal编程技术网

Javascript 变量传递无效-未定义值

Javascript 变量传递无效-未定义值,javascript,html,variables,geolocation,w3c-geolocation,Javascript,Html,Variables,Geolocation,W3c Geolocation,我有一个严重的问题,我已经试着调试了几天了。 我有一个脚本,它获取用户当前的纬度和经度,然后将它们存储在变量中。但是,当我尝试在这个函数之外和//init map区域中使用这些变量时,映射没有显示出来。通过警告变量,我可以看到位置函数外部的变量设置为“未定义”。这是我的密码: //main function here function initialize() { var lat; var lon; //check if user has geo feature if(navigator.ge

我有一个严重的问题,我已经试着调试了几天了。 我有一个脚本,它获取用户当前的纬度和经度,然后将它们存储在变量中。但是,当我尝试在这个函数之外和//init map区域中使用这些变量时,映射没有显示出来。通过警告变量,我可以看到位置函数外部的变量设置为“未定义”。这是我的密码:

//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);

}
感谢您的帮助,Ariel这是因为您在函数中声明了变量。变量对于
initialize
函数是私有的,只能从函数内部访问。如果需要能够在initialize函数之外访问变量,则将变量声明移出函数

var lat;
var lon;
function initialize() {
...
看看这个关于JavaScript中变量作用域的例子。

更新

再次查看代码时,我意识到问题不是可变范围,而是缩进造成的混乱。我不熟悉地理定位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");
}
}
这是因为您在函数中声明了变量。变量对于
initialize
函数是私有的,只能从函数内部访问。如果需要能够在initialize函数之外访问变量,则将变量声明移出函数

var lat;
var lon;
function initialize() {
...
看看这个关于JavaScript中变量作用域的例子。

更新

再次查看代码时,我意识到问题不是可变范围,而是缩进造成的混乱。我不熟悉地理定位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");
}
}

更多的是对另一个答案的更正。范围问题无关紧要。如原始代码
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问题。无论您使用的是什么google api,这似乎都是一个问题。这个问题应该加上这样的标签,因为我不知道这个API,也不知道你是否称它为错误的。

另一个答案的更多更正。范围问题无关紧要。如原始代码
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问题。无论您使用的是什么google api,这似乎都是一个问题。这个问题应该加上这样的标签,因为我不知道这个API,也不知道你是否称它为错误。

这不是我的问题,我的问题是在“中心:新google.maps.LatLng(lat,lon)”中,“变量lat和lon显然根本没有值。@arielschon12如果
console.log,你会得到什么(position.coords.latitude,position.coords.longitude);
在该函数中?@arielschon12更新了我的答案!非常感谢你,你是一个救生员这不是我的问题,我的问题是“中心:新谷歌地图。LatLng(lat,lon)”中的问题变量lat和lon显然没有任何价值。@arielschon12如果在该函数中使用
console.log(position.coords.latitude,position.coords.longitude);
,你会得到什么?@arielschon12更新了我的答案!非常感谢你,你是个救生员