我正在创建一个允许与Node.js和Socket.io建立两个套接字连接的游戏。有一个"主持人"和"加入"功能。首先主机连接,但我想确保它们不能再连接到另一个游戏,所以我输入一个条件来检查是否已为该套接字创建了游戏对象。由于某种原因,(使用下面使用的简化代码),Game对象不会与UserSocket对象一起保存。我认为这是一个范围问题,但不是很确定。
function Game(gameid) {
this.gameID = gameid;
this.joined = false;
this.active = false;
this.baseball = false;
}
function UserSocket(sock) {
o = this;
o.sock = sock;
o.sock.on('clientData', function (data) {
o.CreateGame(data);
});
o.CreateGame = function (hostdata) {
console.log('in create game');
--->console.log(o.game); //*** this call always returns null
if (o.game) {
console.log('game already started'); // this never happens
return false;
}
newgame = new Game(hostdata);
console.log("game object created");
console.log(newgame.gameID);
newgame.host = o.sock;
o.game = newgame;
console.log(o.game);
arrGames.push(newgame);
o.SendToHostSocket("Hosting game: " + newgame.gameID );
}
}
答案 0 :(得分:1)
你至少需要改变:
function UserSocket(sock) {
o = this;
...
到此:
function UserSocket(sock) {
var o = this;
...
你拥有它的方式,o
是一个隐含的全局变量。如果有人第二次调用new UserSocket()
,您将覆盖o
中的值,然后您的第一个套接字将无法正常工作。
在Javascript中,所有仅在函数内使用的变量在第一次声明时都应以var
开头。如果你把它排除在外,那么它们就会成为所有代码都可以访问的“隐式全局变量”,并且会被无意中覆盖。隐式全局变量是一种糟糕的编码实践,通常会导致错误,事实上,如果您在严格模式下运行代码,这会导致错误,代码甚至无法运行。