全局变量返回未定义的外部函数

时间:2017-02-10 20:45:37

标签: javascript html

全局变量在函数外部定义,但它们是否仍然不提示范围外的值?正如我所提到的,第一个警报工作(分配值),但第二个没有。

 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??

1 个答案:

答案 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