2013-10-20 73 views
2

我试图让下面的代码工作(console.log只是为了看看发生了什么)。我已经在任何函数之外声明了全局变量,但它似乎只是在函数内更新它们。Javascript全局变量不在任何函数之外更新

<script type="text/javascript"> 

var map; 
var geocoder; 
var address; 

function initialize(){ 
    geocoder = new google.maps.Geocoder(); 

    var mapOptions = { 
     center:new google.maps.LatLng(-76.146294, 43.052081), 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     zoom: 15, 
     streetViewControl: false 
    }; 

    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 
    loadAddress(); 
    console.log("initialize function: " + address); //this correctly returns the updated address 
} 

function loadAddress(){ 
    var property = <?php echo json_encode(urlencode($Residential['ReAddress'])); ?>; 
    var zipCode = <?php echo json_encode($Residential['zipCode']); ?>; 
    address = property + "," + zipCode; 
    geocoder.geocode({'address': address}, function(result, status){ 
     if(status === "OK"){ 
      map.setCenter(result[0].geometry.location); 
      var marker = new google.maps.Marker({ 
       map: map, 
       position: result[0].geometry.location 
      }); 
     } 
     else { 
      alert("Failed to geocode: " + status); 
     } 
    }); 
} 

google.maps.event.addDomListener(window, 'load', initialize); 
</script> 

上面的正常工作 - 在“地址”变量更新正确的,当我在初始化()函数到底登录到控制台,它显示正常。问题是,如果我试图在同一个变量登录到控制台进一步下跌的页面:

<script type="text/javascript"> 
console.log("further down page: " + address); //this comes back as 'undefined' 
</script> 

当我尝试这样做,我只是得到“未定义”。我对javascript非常陌生,但我的理解是,如果变量是在任何函数之外声明的,那么它是一个全局变量,它应该可以在任何地方访问。我觉得我错过了一些非常明显的东西,但我不知道是什么(而且我花了不少时间搜索!)。

我的直觉是,它必须与initialize()不会被调用,直到页面加载后,但'地址'试图在页面加载完成之前被记录。如果这是问题,我不知道如何解决它。

另外,我确定上面的代码并不是做事的最佳方式,但这实际上更像是一种学习体验。谢谢!

回答

1

您的预感是正确的。在调用initialize方法之前,页面下方的代码正在执行。 window.load is not fired until the DOM is loaded, including images

load事件在文档加载过程结束时触发。此时,文档中的所有对象都在DOM中,并且所有图像和子帧都已完成加载。

这里的一个简单的解决方法是立即定义address。它的组件在页面上是静态的,没有理由在函数内部发生。

var property = <?php echo json_encode(urlencode($Residential['ReAddress'])); ?>; 
    var zipCode = <?php echo json_encode($Residential['zipCode']); ?>; 
    var address = property + "," + zipCode; 

    function loadAddress() { 
     // ... 
    } 
+0

我觉得必须是这个问题,但由于某种原因,解决方案没有跳出来,但是你做了什么非常合理 - 谢谢! – falc2

1

问题是geocoder.geocode函数是异步:它不会阻止代码,执行以下行,但直到服务器响应才会调用内部回调。

这意味着你必须把你的console.log线回调或在从回调调用的函数:

geocoder.geocode({'address': address}, function(result, status){ 
    if(status === "OK"){ 
     map.setCenter(result[0].geometry.location); 
     var marker = new google.maps.Marker({ 
      map: map, 
      position: result[0].geometry.location 
     }); 
    } else { 
     alert("Failed to geocode: " + status); 
    } 
    otherFunc(); 
}); 

function otherFunc(){ 
    console.log("further down page: " + address); 
} 
0

的问题是,第二<script> - 元素是正确的离开时,浏览器中执行加载页面。在您的第一个块中,您将为负载事件添加DOM侦听器,应该调用initialize()。但是,稍后浏览器完全加载并构建页面时会执行该操作。

如果您在将回调确定为geocoder.geocode()之后记录该值,则应打印适当的值。