首页 > 解决方案 > 我有一个同时定义和未定义的变量

问题描述

我在 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)在同一个函数中添加 a 并在给我错误的行之前循环,它会给我同样的错误,但将 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;
        }
      }
    }
  }
}

标签: javascriptundefined

解决方案


考虑以下代码片段,它在整个代码中都存在(对于yyxx):

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

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


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

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

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

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


推荐阅读