与谷歌地图的工作,我有以下代码:Javascript:在循环中定义一个函数时创建一个变量static?
var tileNames = ["base", "parking", "access"];
var mapType = {};
for (var i = 0; i < tileNames.length; i++) {
var tileOptions = {
getTileUrl: function(coord, zoom) {
return "/maps/tiles/tiles" + tileNames[i] + "/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
},
tileSize: new google.maps.Size(256, 256)
};
mapType[tileNames[i]] = new google.maps.ImageMapType(tileOptions);
};
这里是我的问题:“tileNames [I]”中的“getTileUrl”功能在执行功能时,是不确定的。然而,“tileNames”数组仅用于定义“mapType”对象,因此,与传递给函数的“coord”和“zoom”变量不同,我正在使用“tileNames [我]“来定义这部分功能。因此,理想情况下,分配给mapType.parking功能应该是这样的......
function(coord, zoom) {
return "/maps/tiles/tilesparking/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
};
...该功能在第一段代码定义之后。有什么方法可以获取变量/数组的值,并使用它来静态定义一个函数,同时将其他两个变量保留为变量。
编辑:看着下面的各种答案,以下是我已经能够迄今为止达到最佳。虽然绑定可能是更普遍情况下的理想方法,但在这种特定情况下,“getTileUrl:”显然需要特定的语法,并将绑定放置在为其定义的函数上会导致Google Maps错误。在试用KGZM的建议时,它可以在任何情况下更新,而不是在IE8及更低版本中。
var tileNames = ["beloit", "parking", "access_p"];
var mapType = {};
for (var i = 0; i <= (tileNames.length - 1); i++) {
(function(i) {
tileOptions = {
getTileUrl: function(coord, zoom) {
return "/maps/tiles/tiles" + tileNames[i] + "/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
},
tileSize: new google.maps.Size(256, 256)
};
mapType[tileNames[i]] = new google.maps.ImageMapType(tileOptions);
})(i);
};
这是一个范围问题。在循环中定义函数往往会导致这个错误。在循环外定义你的函数,并按照flynfish的建议传入索引。 – Joe
@JoeTuskan,这是一个迟到的回应,但他无法通过索引作为参数的原因是因为Google Maps API为他定义了这些函数的参数,这就是为什么我在下面建议“绑定”的原因。 –