在javascript中实例化循环中的类使用最后一个值

在javascript中实例化循环中的类使用最后一个值,javascript,class,loops,closures,Javascript,Class,Loops,Closures,首先,我知道JavaScript中有很多关于闭包的问题,特别是在循环方面。我读过很多,但我似乎不知道如何解决我自己的特殊问题。我的主要经验是C语言、C++和一些ASM,它正在逐渐适应JavaScript。 我试图在一些for循环中用类(称为Tile)的新实例填充一个三维数组。我所要做的就是传递一个对其他类(称为Group)的引用,该类在第一个循环中实例化(并添加到另一个数组中)。正如您可能猜到的,循环完成后,Tile类的每个实例都有一个对同一个组对象的引用,即最后一个要创建的对象 显然,不是传递

首先,我知道JavaScript中有很多关于闭包的问题,特别是在循环方面。我读过很多,但我似乎不知道如何解决我自己的特殊问题。我的主要经验是C语言、C++和一些ASM,它正在逐渐适应JavaScript。 我试图在一些for循环中用类(称为Tile)的新实例填充一个三维数组。我所要做的就是传递一个对其他类(称为Group)的引用,该类在第一个循环中实例化(并添加到另一个数组中)。正如您可能猜到的,循环完成后,Tile类的每个实例都有一个对同一个组对象的引用,即最后一个要创建的对象

显然,不是传递对组对象的引用,而是传递对函数局部变量的引用,该引用在循环的每次迭代中都会更新。我的假设是,解决这个问题与闭包有关,因为我在寻找解决方案时遇到了许多类似的问题

我发布了一些精简的代码,暴露了问题的核心:

//GW2名称空间
(函数(GW2,$,未定义){
//GW2文件类
GW2.Tile=函数(全局设置,kineticGroup)
{
//私人骑兵
var tilegroup=运动组;
//console.log(tilegroup.grrr);//显示正确的值
var设置=全局设置;
this.Test=函数(){
控制台日志(tilegroup.grrr);
}
this.Test2=函数(组){
console.log(group.grrr);
}
}//类
}(window.GW2=window.GW2 |{},jQuery));
var zoomGroups=[];
var-tiles=[];
变量设置={};
initarray();
平铺[0,0,0]。测试()//我想要的工作,应该给0
tiles[0,0,0].Test2(ZoomGroup[0])//我将如何解决这个问题
函数InitArrays(){
变量i,j,k,缩放倍增管,平铺;
对于(i=0;i)多维数组
问题
上面代码的第一个问题是如何尝试创建多维数组

您使用的语法是:

tiles[0,0,0]
但是,JavaScript对此的解释是:

tiles[0]
访问多维阵列 如果要访问多维阵列,必须使用:

tiles[0][0][0]
要创建多维阵列,您需要执行以下操作:

tiles = [];
tiles[0] = [];
tiles[0][0] = [];
tiles[0][0][0] = 'value';
或:


关于你的代码 在您的代码中,您应该使用:

tiles[i][j][k] = tile;
但是,在设置子数组的值之前,还应该确保每个子数组实际存在,否则会出现
未定义
非法偏移
错误

您可以通过以下方式执行此操作:

(typeof tiles[i] === 'undefined') && (tiles[i] = []);
(typeof tiles[i][j] === 'undefined') && (tiles[i][j] = []);
tiles[i][j][k] = tile;
显然,可以根据您遍历循环的方式对上述内容进行优化,也就是说,在进入
[j]
循环之前,最好确保
平铺[i]
级别作为数组存在,然后在进入
[j]
循环时不必再次检查它的存在


其他选择 根据您的数据集是什么,或者至少您希望使用
tiles
数组做什么,可以考虑使用对象来代替:

/// set up
tiles = {};

/// assignment
tiles[i+','+j+','+k] = 'value';
尽管我的假设和不同的JavaScript解释器多次证明我错了,但这种方法可能会慢一些,这可能是你的朋友


优化 使用
tiles[i][j][k]
方法的一个好处是,它为您提供了优化引用的机会。例如,如果您要在多维数组的一个级别上处理多个操作,您应该执行以下操作:

/// set up
var ij = tiles[i][j];

/// use in loops or elsewhere
ij[k] = 'value'

但是,如果您不止一次访问同一级别,这才是有益的。

您希望使用
tiles[0,0,0]
实现什么?--这种结构不会达到您预期的效果,我认为……在JavaScript中不会。首先吸引我注意的是像
tiles[0,0,0]
这样的“语法”——我猜您的意思是
tiles[0][0][0]
[0,0,0]
自身构造一个数组。使用
tiles[i]
tiles[i][j]
tiles[i][j][k]
我猜我使用的符号实际上是其他东西的有效代码,没有引起任何错误。爬到角落里呜咽,这确实让我觉得很愚蠢。谢谢你的回答!它总是你看不到的东西,当然:)@Sizzling无忧--从其他语言翻译过来时很容易出错:)不得不说[0,0,0]语法让我困惑了一阵子..嘿,无论如何,希望它能有所帮助。
/// set up
tiles = {};

/// assignment
tiles[i+','+j+','+k] = 'value';
/// set up
var ij = tiles[i][j];

/// use in loops or elsewhere
ij[k] = 'value'