函数改变全局变量

Function changing global variable

我将这个数组传递给一个函数,该函数假设将数组旋转 90 度并 return 结果。然后我想检查新数组是否与 canvas.

上的其他东西发生碰撞
let newArray = [
[0,0,1],
[1,1,1],   
[0,0,0]
];

let test = rotate(newArray);

if ( collision(test) ){
  draw(newArray);
} else {
  draw(test);
}

问题来了。我认为 rotate() 正在更改 newArray 变量,因此 if 语句的计算结果无关紧要,draw() 函数将始终执行相同的操作。

我想 select 检查旋转矩阵是否与其他东西碰撞后要绘制的数组。

function rotate(matrix) {

matrix = matrix.reverse();

for (var i = 0; i < matrix.length; i++) {
 for (var j = 0; j < i; j++) {
  var temp = matrix[i][j];
  matrix[i][j] = matrix[j][i];
  matrix[j][i] = temp;
 }
}
return matrix
}


function collision(mat){

let collision = false;

for ( let i = 0; i < mat.length; i++){
for ( let j = 0; j < mat.length; j++){
  if (mat[i][j] == 1){
    let test = ctx.getImageData(x + 10*j +10, y + 10*i, 1, 1);
      if (test.data != "255,255,255,255" && test.data != "0,0,0,0"){
        collision = true;
      }
  }
 }
 }
return collision;
}

所以你是对的 - rotate 函数中使用的 Array.reverse() 方法不是 return 一个新数组,它修改了同一个数组 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);

我建议更改旋转函数以首先克隆传递给它的数组,然后才执行 Array.reverse() 等。

您可以使用 let newMatrix = JSON.parse(JSON.stringify(matrix)); 克隆这个传递给示例中旋转函数的简单数组,然后对 newMatrix 和 return 执行剩余的操作。

如果您不喜欢这种方法,您也可以创建一个新的空数组并使用双 for 循环(当您使用二维网格时,循环中的循环)使用来自原来的。

是的,您的 rotate 函数正在改变您的数组,因此进入哪个 if 子句并不重要。把它改成这个,因为你必须克隆你的矩阵。

function rotate(matrix) {

    newNatrix = matrix.slice().map( function(row){ return row.slice(); });

    for (var i = 0; i < newNatrix.length; i++) {
        for (var j = 0; j < i; j++) {
            var temp = newNatrix[i][j];
            newNatrix[i][j] = newNatrix[j][i];
            newNatrix[j][i] = temp;
        }
    }
    return newNatrix;
}