2012-09-18 41 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