首页 > 解决方案 > 对象克隆和 eval() 的 Javascript 问题

问题描述

我正在用 socketio 和 nodejs 服务器编写一个小游戏,这对我来说很新鲜。当有人创建游戏时,它会将信息发送到服务器,然后服务器会创建一个包含所有游戏信息的对象。我正在使用 eval() 来制作以游戏名称命名的对象,例如“bob_game = {...}”。这是我的代码:

games.push("Partie de " + data.pseudo);
gamesStatus.push("lobby");
eval("var " + data.pseudo + "_game = {name :'" + data.pseudo + "',status : 2,playerNb : 1,maxPlayerNb :" + data.nbPlayers + ",players : ['" + data.pseudo + "'], xCoords : [], yCoords : [], directions : []}");
io.emit(data.pseudo, {command : "joinGame", game : data.pseudo});
io.emit("updateGameList", {command : "updateGameList", game : games, gameStatus : gamesStatus});

这一切都正常工作,我可以将所有信息发回给其他用户,说游戏已经创建!在网站上,它们是每个可加入游戏的按钮。当您按下其中一个时,它会向服务器发送一个带有游戏 ID 和玩家姓名的 joinGameRequest。所有信息都正确收集,我可以设置一个临时对象替换 bob_game 对象:

game = eval(gameName + "_game");

这样可以避免我在想要进行更改时调用原始对象 bob_game,否则我会将 eval() 放在任何地方,因为 bob 并不总是被称为 bob...但是,我知道在对“游戏”进行了所有更改之后,我必须将所有属性转移回 bob_game “以某种方式保存所有内容”。这就是我遇到问题的地方......我说游戏没有定义......即使我已经在上面做了几行更改并且我能够记录游戏的 playerNb ......所以游戏被定义...

console.log(game.playerNb);
eval(gameName + "_game = game");

我需要帮助请xD

标签: javascriptnode.jsobjectsocket.ioeval

解决方案


不要这样做:

eval("var " + data.pseudo + "_game = {

如果你需要一个叫做“bob_game”的东西,把它放在一个对象里面

var games = {};
var newGameKey = data.pseudo + "_game";
games[newGameKey] = {...};

然后,您始终可以通过该密钥访问它。


推荐阅读