首先,我知道 JavaScript 中有很多关于闭包的问题,尤其是在涉及到循环时。我已经阅读了其中的许多内容,但我似乎无法弄清楚如何解决我自己的特定问题。我的主要经验在于 C#、C++ 和一些 ASM,并且需要一些时间来适应 JavaScript。
我正在尝试在某些 for 循环中使用类的新实例(称为 Tile)填充 3 维数组。我要做的就是传递对在第一个循环中实例化的其他类(称为 Group)的引用(并添加到另一个数组)。正如您可能已经猜到的那样,在循环完成后,Tile 类的每个实例都会引用同一个 Group 对象,即最后一个要创建的对象。
显然,不是传递对 Group 对象的引用,而是传递对函数局部变量的引用,该变量在循环的每次迭代中都会更新。我的假设是解决这个问题与闭包有关,因为这似乎是我在寻找解决方案时遇到的许多类似问题的情况。
我已经发布了一些精简的代码,这些代码暴露了jsFiddle问题的核心:
//GW2 namespace
(function( GW2, $, undefined ) {
//GW2Tile class
GW2.Tile = function(globalSettings, kineticGroup)
{
//Private vars
var tilegroup = kineticGroup;
// console.log(tilegroup.grrr); //Shows the correct value
var settings = globalSettings;
this.Test = function(){
console.log(tilegroup.grrr);
}
this.Test2 = function(group){
console.log(group.grrr);
}
} //Class
}( window.GW2 = window.GW2 || {}, jQuery ));
var zoomGroups = [];
var tiles = [];
var settings = {};
InitArrays();
tiles[0,0,0].Test(); //What I want to work, should give 0
tiles[0,0,0].Test2(zoomGroups[0]); //How I'd work around the issue
function InitArrays(){
var i, j, k, zoomMultiplier, tile;
for(i = 0; i <= 2; i++){
zoomGroups[i] = {};
zoomGroups[i].grrr = i;
tiles[i] = [];
zoomMultiplier = Math.pow(2, i);
for(j = 0; j < zoomMultiplier; j++){
tiles[i,j] = [];
for(k = 0; k < zoomMultiplier; k++){
tile = new GW2.Tile(settings, zoomGroups[i]);
tiles[i,j,k] = tile;
}
}
}
}
到目前为止,在使用 JavaScript 时,我通常会稍微修改代码以使其工作,但我厌倦了使用看起来很混乱的变通方法,因为我知道实际上应该有一些相当简单的解决方案。我只是不喜欢寻求帮助,但这真的让我很头疼。非常感谢任何帮助。