Javascript 未捕获的TypeError:尝试从2D数组接收对象指定变量时,无法读取未定义的属性

Javascript 未捕获的TypeError:尝试从2D数组接收对象指定变量时,无法读取未定义的属性,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我正在使用一个名为“P5.js”的JavaScript库。它有一个setup函数,在加载所有内容后执行;还有一个draw函数,在setup()执行后也开始循环 我正在尝试编写一个迷宫生成算法,我正在为名为x的网格使用一个多维数组(数组数组数组),它只包含Cell对象 我创建的数组如下所示: //Global variable declaration var x = []; //What I write in setup() for(var i = 0; i < nw; i++) {

我正在使用一个名为“P5.js”的JavaScript库。它有一个setup函数,在加载所有内容后执行;还有一个draw函数,在setup()执行后也开始循环

我正在尝试编写一个迷宫生成算法,我正在为名为
x
的网格使用一个多维数组(数组数组数组),它只包含
Cell
对象

我创建的数组如下所示:

//Global variable declaration
var x = [];

//What I write in setup()
for(var i = 0; i < nw; i++) {
  var y = [];
  x.push(y);
}

for(var i = 0; i < nw; i++) {
  for(var j = 0; j < nh; j++) {
    var c = new Cell(i, j);
    x[i].push(c);
  }
}
for(var i = 0; i < x.length; i++) {
  for(var j = 0; j < nh; j++) {
    x[i][j].draw();
    x[i][j].checkNeighbours();
  }
}
this.checkNeighbours = function() {
  if(this.indexY == 0 || x[this.indexX][this.indexY - 1].visited) {
    this.neighbours[0] = false;
  }
}
draw()
函数在单元格的每一侧绘制一条线

现在我的问题来了:

我有一个名为
checkneights()
的函数,它希望从单元格对象访问多维数组,如下所示:

//Global variable declaration
var x = [];

//What I write in setup()
for(var i = 0; i < nw; i++) {
  var y = [];
  x.push(y);
}

for(var i = 0; i < nw; i++) {
  for(var j = 0; j < nh; j++) {
    var c = new Cell(i, j);
    x[i].push(c);
  }
}
for(var i = 0; i < x.length; i++) {
  for(var j = 0; j < nh; j++) {
    x[i][j].draw();
    x[i][j].checkNeighbours();
  }
}
this.checkNeighbours = function() {
  if(this.indexY == 0 || x[this.indexX][this.indexY - 1].visited) {
    this.neighbours[0] = false;
  }
}
现在,我的浏览器只绘制前两个单元格(
x[0][0]
x[0][1]
),然后(在控制台中)说:“未捕获的TypeError:无法读取未定义的属性“0”

问题不是可能的越界异常(在java中称为越界异常),因为当我删除
-1
时,它也会说同样的话。当我输入
x[0][0]时,它返回
false
而不是
undefined
。 有人知道是什么导致了这个问题吗?

它并不是说“无法设置未定义的属性0”,所以它不可能是this.neights[0]=false行

x[this.indexX]必须是未定义的

试试这个:

this.checkNeighbours = function() {

  console.log('this.indexX: ', this.indexX);
  var xx = x[this.indexX];
  console.log('xx: ', xx);

  if(this.indexY == 0 || x[this.indexX][this.indexY - 1].visited) {
    this.neighbours[0] = false;
  }
}
另外,在设置完console.log(x)之后,在第一次调用checkneights之前,在控制台中检查它,看看它是否包含您所期望的内容

另一种可能性是,错误根本不在这段代码中,而是在单元格构造函数或其他地方


错误引用的代码行是什么?

在控制台中,它按原样打印阵列(x)。但是它也会打印:xx:false它引用的那行是我尝试调用x[this.indexX][this.indexX-1]的那一行。访问过。它对this.indexX说了什么?如果你说console.log(这个),它打印的东西看起来像一个单元格对象吗?你能把你的javascript发布到github或JSFIDLE上,让我们自己试试吗?