如何解决Javascript范围问题。是关闭的答案?

时间:2013-04-06 06:25:16

标签: javascript jquery function google-maps closures

我有一个功能

function getCustomAddress() {
    alert(results[i].formatted_address)
}

alert(results[i].formatted_address)在另一个函数中定义。它显然意味着它在getCustomAddress中未定义,因此如何解决此问题并提醒值。我也设置了一个小提琴。

http://jsfiddle.net/KEdrq/5/

3 个答案:

答案 0 :(得分:1)

您可以将其作为函数参数传递

function getCustomAddress(result) {
    alert(result.formatted_address)
}

所以当您调用该函数时,您需要提供一个参数: getCustomAddress(结果[I]);例如

答案 1 :(得分:1)

您可以使用函数创建一个私有作用域,并在那里定义所有全局变量:

(function(){
 var results = [];
 function getCustomerAdress(){
 //... call result etс
 }

 function set result(){
 //... set result etc
 }

 // some code for initialization, setting onload handlers etc
})();

答案 2 :(得分:1)

我检查了jsFiddle,结果被作为ajax请求获取。 您需要将结果存储在具有全局范围的变量中,然后设置超时以获取结果。您也可以在地理编码器请求结束之前执行您的功能,并将结果变量传递给它。

geocoder.geocode(geocoderRequest, function (results, status) { 
  // execute your function here. getCustomAddress(result)
}

检查我所做的更改。 http://jsfiddle.net/KEdrq/7/

代码更改摘要。

 var _results;

 function initialize() {
.
.
.
     google.maps.event.addListener(marker, 'dragend', function (e) {

         getAddress(e.latLng);
         setTimeout('getCustomAddress(0);', 500);
     })

     function getAddress(latLng) {
         if (!geocoder) {
             geocoder = new google.maps.Geocoder();
         }
         var geocoderRequest = {
             latLng: latLng
         }
         geocoder.geocode(geocoderRequest, function (results, status) {
             _results = results;
.
.
.

 function getCustomAddress(i) {
     alert(_results[i].formatted_address)
 }

您可能希望创建一个for循环以警告所有结果,而不是在getCustomAddress函数中传递结果ID。