【问题标题】:How to resolve a Javascript Scope issue. Is closure the answer? [duplicate]如何解决 Javascript 范围问题。关闭是答案吗? [复制]
【发布时间】:2013-03-28 16:30:24
【问题描述】:

我有一个功能

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

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

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

【问题讨论】:

  • 如果您发布了一个 jsfiddle 示例,请发布一个好的示例。
  • 你想让我怎么编辑一个fiffle,不清楚吗?由于回调性质,它无法通过分离脚本和标记猜测来使其工作。

标签: javascript jquery function google-maps closures


【解决方案1】:

你可以把它作为函数参数传递

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

因此,当您调用该函数时,您需要提供一个参数: 获取自定义地址(结果 [i]);例如

【讨论】:

    【解决方案2】:

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

    (function(){
     var results = [];
     function getCustomerAdress(){
     //... call result etс
     }
    
     function set result(){
     //... set result etc
     }
    
     // some code for initialization, setting onload handlers etc
    })();
    

    【讨论】:

      【解决方案3】:

      我检查了 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 2021-01-17
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        相关资源
        最近更新 更多