Googleマップで作業すると、次のコードがあります:
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);
};
私の問題は次のとおりです。「getTileUrl」関数の「tileNames [i]」は、関数の実行時に未定義です。ただし、「tileNames」配列は、ここで「mapType」オブジェクトを定義する際にのみ使用することを意図しているため、関数に渡される「coord」および「zoom」変数とは異なり、「tileNames[ i]" を使用して、関数のその部分を定義します。したがって、理想的には、mapType.parking に割り当てられる関数は次のようになります...
function(coord, zoom) {
return "/maps/tiles/tilesparking/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
};
...関数がコードの最初の部分で定義された後。変数/配列の値を取得し、それを使用して関数を静的に定義しながら、他の2つの変数を変数として維持する方法はありますか?
編集:以下のさまざまな回答を見ると、これまでに達成できた最高のものは次のとおりです。より一般的なシナリオではバインドが理想的なアプローチかもしれませんが、この特定のケースでは、「getTileUrl:」は明らかに特定の構文を必要としており、定義された関数の周りにバインドを配置すると、マップでエラーが発生します。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);
};