全局变量在函数外部定义,但它们是否仍然不提示范围外的值?正如我所提到的,第一个警报工作(分配值),但第二个没有。
window.onload=getLocation();
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}
var lat;
var lng;
function showPosition(position) {
lat = position.coords.latitude.toFixed(3);
lng = position.coords.longitude.toFixed(3);
alert(lng); //alert done correctly
var centerMap = new google.maps.LatLng(lat,lng);
var directionsDisplay = new google.maps.DirectionsRenderer;
var directionsService = new google.maps.DirectionsService;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 14,
center: centerMap
});
directionsDisplay.setMap(map);
calculateAndDisplayRoute(directionsService, directionsDisplay);
document.getElementById('mode').addEventListener('change', function() {
calculateAndDisplayRoute(directionsService, directionsDisplay);
});
}
alert(lng); //return nothing??
答案 0 :(得分:0)
有三个问题,我将分别解决。
-
首先 - 您错误地分配了window.onload
。
// This calls getLocation() and assigns the returned value to window.onload
window.onload=getLocation();
// This is what you intended - it assigns the function getLocation to window.onload,
// which means getLocation will be called when the window finishes loading
window.onload=getLocation;
-
其次,{<1}}在所有脚本加载后触发。因此,即使在调用window.onload
之前定义window.onload=getLocation
,警报也会首先运行,因为在加载脚本之前不会触发alert(lng)
事件。你可以通过这样做来测试:
window.onload
您将观察到第二个命令在第一个命令之前执行。
如果您希望在加载窗口时一个接一个地发生两件事,您可以将它们放在window.onload函数中,如下所示:
window.onload = function() { console.log("window load function"); };
console.log("logging after window.onload is assigned");
但请注意,在这种特殊情况下,由于第3项,这仍然不够。
-
第三:window.onload = function () {
getLocation();
alert(lng);
};
是一个异步函数。您的程序在等待获取位置时继续运行,然后调用您为其定义的回调。因此,即使您在调用getLocation()之后navigator.geolocation.getCurrentPosition()
,alert(lng)
仍然为NULL,因为lng
尚未触发getCurrentPosition
。要使所有此代码按所需顺序执行,请在加载窗口时尝试以下操作:
showPosition