javascript - 我有一个同时定义和未定义的变量
问题描述
我在 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;
}
}
}
}
}
解决方案
考虑以下代码片段,它在整个代码中都存在(对于yy
和xx
):
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);
}
推荐阅读
- asynchronous - xUnit 不接受带有返回 Task<> 的方法的同步抛出
- php - 在 PHP 中更改数组格式
- javascript - 在 JavaScript 中深度复制一个对象后,该对象中的数组是否也会被转换为对象?
- sql - 如何合并两行并使其成为一行 SQL
- sql - 有没有一种惯用的方法来更新 PostgreSQL 中的某些字段?
- javascript - 通过正则表达式验证 js 时得到“太多递归”
- json - 空返回ansible查询
- html - 如何突出显示当前部分 [Power Apps 菜单]
- flutter - 当我滚动屏幕时,复选框在下面的颤动代码中被取消选中?
- laravel - Laravel 仅将 cookie 用于 Nova 后端