函数内部的数组javascript

时间:2012-09-18 09:27:01

标签: javascript arrays function

我想要完成的是调用result.MappingWaypoints[i].lat();result.MappingWaypoints[i].lng();代替result.MappingWaypoints[i].lat;result.MappingWaypoints[i].lng

这甚至可能吗?

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)

我知道这似乎是一件奇怪的事情,但我正在使用的算法确实需要将数据作为函数调用来访问,因为算法还处理来自google api的数据,其中数据只能通过相同的函数访问调用lat()和lng()。谢谢:)

3 个答案:

答案 0 :(得分: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参数意味着get,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

答案 1 :(得分: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;

答案 2 :(得分:0)

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

我不明白为什么这是必要的