【发布时间】:2013-07-03 11:45:25
【问题描述】:
首先,我知道在 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 时,我通常会稍微修改代码以使其正常工作,但我已经厌倦了使用看起来很混乱的变通办法,因为我知道实际上应该有一些相当简单的解决方案.我只是不喜欢寻求帮助,但这真的让我很头疼。非常感谢任何帮助。
【问题讨论】:
-
您希望通过
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] -
我猜我使用的符号实际上是其他东西的有效代码,不会引发错误。 爬到角落里抽泣
标签: javascript class loops closures