Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
局部变量正在更新类实例变量,不允许在javascript中进行进一步更新_Javascript - Fatal编程技术网

局部变量正在更新类实例变量,不允许在javascript中进行进一步更新

局部变量正在更新类实例变量,不允许在javascript中进行进一步更新,javascript,Javascript,当我在游戏中移动后记录当前棋盘状态时,棋盘无法正确更新。具体来说,makeMove中的tempBoard对游戏状态进行更改。我认为tempBoard只是一个局部变量,只有在调用updateBoard时才会更改实际的板。我知道这一定是我错过了一些简单的东西,但似乎无法理解。谢谢 控制台输出如下: “原件:1,2,3,4,5,6,7,8,9” “旧板:1,2,3,4,5,6,7,8,9” “前临时板:1,2,3,4,5,6,7,8,9” “1,2,3,4,5,6,7,8,X之后的临时板” “来自ma

当我在
游戏
中移动后记录当前棋盘状态时,棋盘无法正确更新。具体来说,
makeMove
中的
tempBoard
游戏状态进行更改。我认为
tempBoard
只是一个局部变量,只有在调用
updateBoard
时才会更改实际的板。我知道这一定是我错过了一些简单的东西,但似乎无法理解。谢谢

控制台输出如下:

“原件:1,2,3,4,5,6,7,8,9”

“旧板:1,2,3,4,5,6,7,8,9”

“前临时板:1,2,3,4,5,6,7,8,9”

“1,2,3,4,5,6,7,8,X之后的临时板”

“来自makeMove:1,2,3,4,5,6,7,8,X”

“旧板:1,2,3,4,5,6,7,8,X”

前临时板:1,2,3,4,5,6,7,8,X

“1,2,X,4,5,6,7,8,X之后的临时板”

来自makeMove:1,2,X,4,5,6,7,8,X

旧板:1,2,X,4,5,6,7,8,X

前临时板:1,2,X,4,5,6,7,8,X

“1,2,X,4,X,6,7,8,X后的临时板”

来自makeMove:1,2,X,4,X,6,7,8,X

移动后:1,2,X,4,X,6,7,8,X

旧版:1,2,X,4,X,6,7,8,X

“板复位:1,2,X,4,X,6,7,8,X”

代码如下:

//游戏课

var Game = function(board,playerToken,compToken){
    this.board = board;
    this.playerToken = playerToken;
    this.compToken = compToken;

    this.state = new State(board);
    this.playerTurn = true;
};

Game.prototype.getPlayerToken = function(){
    return this.playerToken;
};

Game.prototype.getCompToken = function(){
    return this.compToken;
};

Game.prototype.makeMove = function(move,player){
    var moved = false,
        tempBoard = this.state.getBoard();

    if(this.state.getFreeSpots().indexOf(move) >= 0){
        tempBoard[move - 1] = player.getToken();
        moved = true;
    }
    this.state.updateBoard([1,2,3,4,5,6,7,8,9]);
    console.log("From makeMove: " + this.state.getBoard());
};
//国家级

var State = function(board){
    this.board = board;
};

State.prototype.updateBoard = function(board){
    this.board = board;
};

State.prototype.getBoard = function(){
    return this.board;
};

State.prototype.getTakenSpots = function(player){
    var avail = this.getFreeSpots(),
        taken = [1,2,3,4,5,6,7,8,9],
        curBoard = this.board;

    // Filters out taken positions from 'taken' array
    return taken.filter(function(val){
        return avail.indexOf(val) < 0; 
    }).filter(function(val){
        return curBoard[val - 1] === player;
    });
};

State.prototype.getFreeSpots = function(){
    var movesArr = [];

    movesArr = this.board.filter(function(x){
        return typeof x === "number";
    });
    return movesArr;
};
//玩游戏

function playGame(){
    var board = [1,2,3,4,5,6,7,8,9],
        game,
        player,
        comp,
        reset = false,
        oldBoard;

    var temp = 0,
        temp2;

    player = new Player('X');
    comp = new Player('O');

    game = new Game(board, player.getToken(),comp.getToken());

    console.log("Original: " + game.state.getBoard());
    oldBoard = game.state.getBoard();
    console.log("Old board: " + oldBoard);

    game.makeMove(9,player);
    console.log("Old board: " + oldBoard);
    game.makeMove(3,player);
    console.log("Old board: " + oldBoard);
    game.makeMove(5,player);
    console.log("After moves: " + game.state.getBoard());
    console.log("OldBoard: " + oldBoard);
    //game.state.updateBoard(oldBoard);
    console.log("Board reset: " + game.state.getBoard());
}

数组是对象。变量(和属性)不存储对象,它们存储对对象的引用。(把它想象成一个数字,告诉JavaScript引擎对象在哪里。)因此
State#getBoard
返回对其实际
board
数组的引用,该数组被传递到
Game
,而不是它的副本。考虑:

var a=[1,2,3];
console.log(a[0]);//1.
变量b=a;//对同一数组的引用,而不是它的副本
b[0]=42;

console.log(a[0]);//42
tempBoard=this.state.getBoard()

这个声明得到了实际的董事会。tempBoard包含对实际板的引用。 如果您做了任何更改,实际板将更新

宁可

tempBoard = this.state.getBoard().slice() 

谢谢你的详细解释!我知道我在分配/检索值的方式上遗漏了一些基本的东西。
tempBoard = this.state.getBoard().slice()