未捕获的ReferenceError:lat未定义
可能重复:
JavaScript变量范围
我有我的脚本问题,我想从pos函数获得价值lat,lng,但是当我检查控制台中的元素时,出现此错误:
“Uncaught ReferenceError:lat is not defined TEST.html:30(anonymous function)”
第30行是:var latlng = new google.maps.LatLng(lat,lng); 这是我的完整代码:
<script type="text/javascript">
navigator.geolocation.getCurrentPosition (function (pos){
lat = pos.coords.latitude;
lng = pos.coords.longitude;
});
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
var latlng = new google.maps.LatLng (lat, lng);
var oceanBeach = new google.maps.LatLng(-6.2501199999999999,106.75937);
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
var mapOptions = {
zoom: 14,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng
}
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
directionsDisplay.setMap(map);
}
function calcRoute() {
var selectedMode = document.getElementById("mode").value;
var request = {
origin: latlng,
destination: oceanBeach,
// Note that Javascript allows us to access the constant
// using square brackets and a string value as its
// "property."
travelMode: google.maps.TravelMode[selectedMode]
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
}
});
}
</script>
你至少有两个问题:
变量的范围(它们在子函数中定义,并且在您尝试使用它们的范围中不可用)
getCurrentPosition()
函数是异步的。 这意味着它会在您调用它之后完成一段时间,并且只有在它调用完成回调函数时才会完成。 因此,在您尝试在函数调用后使用结果时,它尚未完成。
要处理getCurrentPosition()
是异步的,你必须这样做:
navigator.geolocation.getCurrentPosition (function (pos){
var lat = pos.coords.latitude;
var lng = pos.coords.longitude;
var latlng = new google.maps.LatLng (lat, lng);
var oceanBeach = new google.maps.LatLng(37.7683909618184, -122.51089453697205);
// any further code that uses these variables
});
// no code here that uses the results of getCurrentPosition()
// because it has not completed yet
你可以在这里看到类似的问题和答案:无法应付navigator.geolocation的异步性质
如果你这样写:它会成为一个问题吗?
navigator.geolocation.getCurrentPosition (function (pos){
var lat = pos.coords.latitude;
var lng = pos.coords.longitude;
var latlng = new google.maps.LatLng (lat, lng);
var oceanBeach = new google.maps.LatLng(37.7683909618184, -122.51089453697205);
});
它叫喊的原因是因为lat在与回调函数外部定义的latlng和oceanBeach不同的范围中定义,并且它在那里没有访问权限
UPDATE
考虑到你的情况,你可以使用回调来解决你的问题,即做一些事情,比如使getCurrentPosition进入它自己的函数,如:
function getCurrentLocation(callback) {
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(pos) {
var lat = pos.coords.latitude;
var lng = pos.coords.longitude;
callback(new google.maps.LatLng(lat,lng), new google.maps.LatLng(-6.2501199999999999,106.75937));
});
}
else {
throw new Error("Your browser does not support geolocation.");
}
}
并为每个即将做的事情分别调用它们
getCurrentLocation(function(latlng,oceanBeach){
// work with latlng and ocean beach here
});
现在终于从每个函数即函数调用
<script type="text/javascript">
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
function initialize() {
getCurrentLocation(function(latlng,oceanBeach){
directionsDisplay = new google.maps.DirectionsRenderer();
var mapOptions = {
zoom: 14,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng
}
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
directionsDisplay.setMap(map);
});
}
</script>
并为calcRoute使用相同的技术。 注意:不应该保持directionsDisplay和directionsService全局的方向,而应该将整个事物放到一个类中,以使它更干净,更符合面向对象
链接地址: http://www.djcxy.com/p/40829.html