如何解决Javascript作用域问题。答案是什么?

如何解决Javascript作用域问题。答案是什么?,javascript,jquery,function,google-maps,closures,Javascript,Jquery,Function,Google Maps,Closures,我有一个函数 function getCustomAddress() { alert(results[i].formatted_address) } 警报(结果[i]。格式化的\u地址)在另一个函数中定义。这显然意味着它在getCustomAddress中未定义,因此如何解决此问题并警告这些值。我还摆好了小提琴 您可以将其作为函数参数传递 function getCustomAddress(result) { alert(result.formatted_address) }

我有一个函数

function getCustomAddress() {
    alert(results[i].formatted_address)
}
警报(结果[i]。格式化的\u地址)
在另一个函数中定义。这显然意味着它在getCustomAddress中未定义,因此如何解决此问题并警告这些值。我还摆好了小提琴


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

function getCustomAddress(result) {
    alert(result.formatted_address)
}
因此,调用函数时,需要提供一个参数:
getCustomAddress(结果[i]);例如

您可以使用函数创建一个私有范围,并在其中定义所有全局变量:

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

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

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

我检查了JSFIDLE,结果作为ajax请求获取。 您需要将结果存储在具有全局作用域的变量中,然后设置获取结果的超时。您还可以在geocoder请求结束之前执行函数,并将结果变量传递给它

geocoder.geocode(geocoderRequest, function (results, status) { 
  // execute your function here. getCustomAddress(result)
}
检查我所做的更改。

代码更改摘要

 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。

如果发布一个JSFIDLE示例,请发布一个好的示例。您希望我如何编辑fiffle,是否不清楚?由于回调的性质,它无法通过分离脚本和标记猜测来让它工作。