我有一个同时定义和未定义的变量

I have a variable that is defined and undefined at the same time

我在 javascript 中写了一些井字游戏的代码,开头是:

var board = [
  [0,0,0],
  [0,0,0],
  [0,0,0]
];

(这是在函数外声明的)

稍后在函数中生成计算机移动时,它会循环运行这行代码:

if (board[xx][yy] == 0) {

但它给了我错误 TypeError: Cannot read property '0' of undefined (xx 等于 0)。

如果我在同一函数中添加一个 console.log(board) 并在出现错误的行之前循环,它会出现相同的错误,但会将 board 的值记录到控制台(在错误之后)。

如果我可以记录变量,为什么我不能在该行中引用它?

这是一些代码:(我没有包括它所指的 HTML)

var board = [
  [0,0,0],
  [0,0,0],
  [0,0,0]
];

const buttonGrid = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
];

function computerMove() {
  //check for winning move
  xx = -1;

  while (xx < 3) {
    xx ++;
    yy = -1;
    while (yy < 3) {
      yy ++;
      if (board[xx][yy] == 0) {       //line with error
        board[xx][yy] = 2;
        if (checkWin() == 2) {        //checkWin returns the winning player
          toClick = (buttonGrid[xx][yy]).toString(); //
          updateBox(toClick, xx, yy); //confirms move
          return;
        }
        else {
          board[xx][yy] = 0;
        }
      }
    }
  }
}

考虑以下代码段,它贯穿于您的整个代码(对于 yyxx):

var yy = -1;
while (yy < 3) {
  yy++;
  console.log(yy);
}

请注意,最终迭代记录 3。您的数组只有三个项目,因此尝试访问索引 3 处的项目将 return undefined.


... < 3 更改为 ... < 2 将解决此问题:

var yy = -1;
while (yy < 2) {
  yy++;
  console.log(yy);
}

或者更好的是,使用传统的 for 循环:

for (let yy = 0; yy <= 2; yy++) {
  console.log(yy);
}