1

以下代码的目标是创建一个二维数组,使得

  • Clip 是一个自定义对象
  • 银行是 (8) 个剪辑的数组
  • 银行是(8)银行的数组
  • bank[a][b] 可以访问每个剪辑,其中 a 是银行(银行)中的索引,b 是剪辑(剪辑)中的索引

在当前状态下,它返回未定义,唉,我不知道为什么。任何关于我做错了什么的建议将不胜感激

var banks = []

function Clip(a,b)

{
this.track = a
this.slot = b
}

function Bank(w)

{

for (var j, j = 0; j <= 7; j++) {
    var clips = []
    var aClip = new Clip(w,j);
    //post(i)
    //post(aClip.length)
    clips[j] = aClip
}
//post();
return clips
}

function makeBanks()

{

for (var k, k = 0; k <= 7; k++) {
    var aBank = Bank(k);
    //post(i)
    //post (aClip.length)
    banks[k] = aBank
}
}

makeBanks();

console.log(banks[0][0])​

提前谢谢了

4

1 回答 1

3

您最大的错误在这里(内部Bank):

for (var j, j = 0; j <= 7; j++) {
    var clips = []
    var aClip = new Clip(w,j);
    //post(i)
    //post(aClip.length)
    clips[j] = aClip
}

您每次通过循环都重新初始化clips,因此唯一保留的值是最后一个值(因为循环在您有机会再次覆盖它之前终止)。为了说明,这是第一次调用返回的内容Bank

[undefined, undefined, undefined, undefined, undefined, 
     undefined, undefined, Clip { track=0, slot=7}]

将声明移到循环之外解决了这个基本问题:

var clips = [];
for (var j = 0; j <= 7; j++) {
    var aClip = new Clip(w, j);
    clips[j] = aClip;
}
return clips;

额外的清理

现在我们已经解决了基本问题,我们可以做更多的事情来清理它:

  • 始终使用分号
  • 除非您打算将它们用作构造函数,否则不要以首字母大写字母命名函数
  • 一致缩进
  • 不要依赖全局变量
  • 一步声明和分配(即var j, j = 0应该是var j = 0

结果:

function Clip(a, b) {
    this.track = a;
    this.slot = b;
}

function makeBank(w) {
    var clips = [];
    for (var j = 0; j <= 7; j++) {
        var aClip = new Clip(w, j);
        clips[j] = aClip;
    }
    return clips;
}

function makeBanks() {
    var banks = [];
    for (var k = 0; k <= 7; k++) {
        var aBank = makeBank(k);
        banks[k] = aBank;
    }
    return banks;
}

var banks = makeBanks();
console.log(banks[0][0]);
于 2012-07-07T06:49:15.503 回答