2012-09-18 105 views
0

我想完成的是調用result.MappingWaypoints[i].lat();result.MappingWaypoints[i].lng();而不是result.MappingWaypoints[i].lat;result.MappingWaypoints[i].lng函數內部的函數javascript

這甚至可能嗎?

var result = new Array(); 
    result = { 
     'MappingWaypoints': MappingWaypoints, 
     'Flightime': flight_time_sec, 
     'PhotoArea': { 'SouthWest': MeterstoGPS(starting_photo_area), 
         'NorthEast': MeterstoGPS(end_photo_area)}, 
    }; 


MappingWaypoints.push(
{ 
    lat : current_point_gps.lat, 
    lng : current_point_gps.lng, 
    Radius : 10, 
    Altitude : Attitude, 
    ClimbRate : ClimbRate, 
    DelayTime : DelayTime, 
    WP_Event_Channel_Value : 100, 
    Heading : 0, 
    Speed : Speed, 
    CAM_Nick : 0, 
    Type : 1, 
    Prefix : "P" 
} 

編輯:我嘗試添加:

lat: function(){ return current_point_gps.lat},` 


lng : function(){ return current_point_gps.lng}, 

但是,這並不工作=>數組中的所有值都具有第一座標的緯度/經度值

EDIT2:謝謝以@DCoder爲這個答案在下面的評論:這解決了我。

lat: (function(v) { return function() { return v; } })(current_point_gps.lat) 

我知道這似乎是一個奇怪的事情,但我使用一個真正的算法需要存取權限的數據是一個函數調用,因爲算法中還從谷歌API處理數據,其中數據僅訪問通過相同的函數調用lat()和lng()。感謝:)

+0

除非您創建更復雜的存儲解決方案,否則一旦'current_point_gps'的值發生變化,到目前爲止給出的答案將會爆炸。 – DCoder

+0

注意 - 你正在混合數組和對象(它們是關聯數組),所以當你將它視爲一個關聯數組/對象時,不要使用'var result = new array()'。 – PhonicUK

+0

@DCoder:你絕對是對的 – Thomas

回答

1

你原來的做法跑進了在this question描述的問題 - 由於JS變量的作用域,所有的功能將指向(並返回)相同的變量。

你需要要返回每個屬性來捕捉,而不是捕捉變量值。要做到這一點最簡單的方法是自動執行功能:

{ 
    lat: (function(v) { return function() { return v; } })(current_point_gps.lat), 
    lng: (function(v) { return function() { return v; } })(current_point_gps.lng), 
    .... 
} 

如果您需要一種方法來還可以編輯lat屬性,那麼您可將公共屬性添加到對象,就像這樣:

{ 
    lat: function() { return this._lat; }, 
    _lat: current_point_gps.lat 
} 

或者你可以使用類似於jQuery的東西「0參數指搞定,1個參數來設定」模式,並使用此:

{ 
    lat: (function(v) { return function() { 
    if(arguments.length) { 
     v = arguments[0]; 
    } else { 
     return v; 
    }; 
    })(current_point_gps.lat) 
} 

obj.lat(); // returns the current value 
obj.lat(55); // changes the current value to 55, returns nothing 
obj.lat(); // returns 55 
+0

一旦數組創建後,是否也可以使用或不使用函數更改lat和lng的值? (編輯:不推;我想改變lat/lng的值,因爲他們的座標旋轉) – Thomas

+0

@ThomasVerbeke:是的,更新的答案。 – DCoder

0

您需要將它們作爲函數調用。

lat : function(){ return current_point_gps.lat }, 
lng : function(){ return current_point_gps.lng }, 

這應該工作(未測試;))。

但是,爲什麼你不想這麼做?

編輯:

如果你想傳遞的功能,你不應該調用該函數。

// Pass the Result of a function, the function is called 
var foobar = result.MappingWaypoints[i].lng(); 

// Pass the function itself, the function wont be called 
var foobar = result.MappingWaypoints[i].lng; 
+0

我應該提到我嘗試過。我知道這似乎很奇怪,但原因是,另一種方法絕對需要作爲函數訪問數據... – Thomas

+0

然後嘗試此操作並刪除(); – SvenFinke

+0

這樣變量變成函數。但是使用lat();你會傳遞函數的結果,這將是一個字符串。傳遞經緯度,然後你會傳遞函數本身。 – SvenFinke

0
lat : function() { return current_point_gps.lat }, 
lng : function() { return current_point_gps.lng }, 

我不明白爲什麼這是必要的,雖然

+0

應該提到我嘗試過。我知道這似乎很奇怪,但原因是,另一種方法絕對需要作爲函數訪問數據。 – Thomas