未捕获的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

    上一篇: Uncaught ReferenceError: lat is not defined

    下一篇: variables scope confusion in javascript