2012-03-13 84 views
0

我把JS範圍混淆了。我試圖將值分配給座標並稍後使用它們,但由於某些原因,我始終將座標值設爲空值。JavaScript錯誤範圍

var thing = (function($){ 
    var obj = function(config) { 
    $.extend(obj.config, config); 
    obj.init(); 
    }; 
    $.extend(obj, { 
     coordinates: {}, 
     browser_geolocation: function() { 
      if (navigator.geolocation) { 
        var timeoutVal = 10 * 1000 * 1000; 
        navigator.geolocation.getCurrentPosition(
        obj.browser_coordinates, //set coordinates 
        maps.browser_error, 
        { enableHighAccuracy: true, timeout: timeoutVal, maximumAge: 0 } 
       ); 
       } 
       else { 
        alert("Geolocation is not supported by this browser"); 
       } 
     }, 

     browser_coordinates: function(position) { 
      obj.coordinates.long = position.coords.longitude; 
      obj.coordinates.lat = position.coords.latitude; 
     }, 
    }); 



$(function() { 
     maps.browser_geolocation(); 
      maps.browser_geolocation(); 

     console.log(obj.coordinates); 
    }); 
    return obj; 
}(jQuery)); 

我似乎無法弄清楚我做錯了什麼?

+0

你真的打算把一個函數對象的屬性? – 2012-03-13 00:40:32

+0

@ruakh對不起,我已更正我的問題。 – 2012-03-13 00:40:49

+0

@ruakh它應該是obj.coordinates不是obj.address,我又壞了。 – 2012-03-13 00:46:24

回答

1

您這裏有兩個主要問題:

  1. navigator.geolocation.getCurrentPosition是異步的。
  2. 未定義(或未包含在您的示例中)變量。

你可能想看看JavaScript中的原型繼承,它不像看起來那麼難。

這裏是你如何能創建使用回調定製對象的例子:

function GetCoordinates(callback) { 

    var successCallback = function (position) { 
     this.coordinates = position.coords; 
     callback(); 
    }; 

    var errorCallback = function (error) { 
     throw error; 
    }; 

    var self = this; 
    if (navigator.geolocation) { 
     var timeoutVal = 10 * 1000 * 1000; 
     navigator.geolocation.getCurrentPosition(function() { 
      successCallback.apply(self, arguments) 
     }, errorCallback, { 
      enableHighAccuracy: true, 
      timeout: timeoutVal, 
      maximumAge: 0 
     }); 
    } 

} 


(function() { 

    // callback to execute once coordinates are ready 
    var myCallback = function() { 
     console.log(c.coordinates); // Coordinates 
    }; 

    // create object (don't forget new :)) 
    var c = new GetCoordinates(myCallback); 

    // because geolocation.getCurrentPosition is async, the following will be undefined 
    console.log(typeof c.coordinates); 

}()); 
+0

感謝您的解釋。很有幫助。 – 2012-03-13 02:06:29