Javascript变量问题,简单的问题

时间:2009-08-19 10:58:24

标签: javascript

var num = rez.data.length;

for(var key=0;key<num;key++)
{
  var marker = [];
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  marker[key] = new GMarker(point, {icon: iconS});
  GEvent.addListener(marker[key], "click", function() 
  {
    marker[key].openInfoWindowHtml('xxxxxx');
  });
  map.getMap().addOverlay(marker[key]); 
}

我在这里需要帮助,任何人都可以告诉我为什么行marker[key] marker[key].openInfoWindowHtml('xxxxxx');未定义?我在这里定义了它:marker[key] = new GMarker(point, {icon: iconS});

4 个答案:

答案 0 :(得分:3)

除了其他答案所表明的,你还有另一个问题。

您的key变量的范围在您的内部事件处理函数之外。每次增加key时,您将更改将在事件处理程序中使用的值。

实际上,假设num等于10.所有点击事件处理程序最终都会调用以下代码:

function() {
    marker[10].openInfoWindowHtml('xxxxxx');
}

解决此问题的一种方法是将循环内容范围限定在另一个函数中并立即调用它:

var num = rez.data.length;
var marker = [];
for(var key=0;key<num;key++)
{
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  marker[key] = new GMarker(point, {icon: iconS});
  function(key) {
    GEvent.addListener(marker[key], "click", function() {
      marker[key].openInfoWindowHtml('xxxxxx');
    });
  }(key);
  map.getMap().addOverlay(marker[key]); 
}

编辑:澄清。我所做的是我声明一个匿名函数,我立即调用它。另一种方法可以更清楚地了解正在发生的事情,

function(key) {
  GEvent.addListener(marker[key], "click", function() {
    marker[key].openInfoWindowHtml('xxxxxx');
  });
}(key);

可以替换为:

function temp(key) {
  GEvent.addListener(marker[key], "click", function() {
    marker[key].openInfoWindowHtml('xxxxxx');
  });
};

temp(key);

即,首先声明一个名为temp的临时函数,然后在之后调用它。

答案 1 :(得分:1)

你应该在进入那个循环之前定义标记数组 ...

var num = rez.data.length;
var marker = [];

for(var key=0;key<num;key++)
{
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  marker[key] = new GMarker(point, {icon: iconS});
    GEvent.addListener(marker[key], "click", function() 
    {
      marker[key].openInfoWindowHtml('xxxxxx');
    });
  map.getMap().addOverlay(marker[key]); 
}

...否则每次循环运行时都会重置它,并且数组中只有一个标记为num - 1。

答案 2 :(得分:1)

从闭包中访问

key - 所有侦听器函数将共享相同的key。 for循环结束后,key应该等于num,显然marker[num]将是undefined。您可以在处理程序中使用alert(key)进行验证。

您需要定义侦听器函数时使用的特定键。您可以通过在输入稳定的上下文中创建侦听器函数来完成此操作,例如:

function createListener(marker) {
  return function() {
    marker.openInfoWindowHtml('xxxxxx');
  };
}

var num = rez.data.length;

var markers = [];
for(var key=0;key<num;key++)
{
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  var marker = new GMarker(point, {icon: iconS});
  markers[key] = marker;
  GEvent.addListener(marker, "click", createListener(marker));
  map.getMap().addOverlay(marker); 
}

答案 3 :(得分:-1)

1:你确定新的GMarker(点,{icon:iconS})返回了有效的结果吗?你似乎没有检查有效性

2:marker [key]仅在基本循环中定义。当你调用GEvent.addListener时,你基本上创建了一个匿名函数。可能未在该范围中定义标记变量。使用bind()或全局声明它。