[英]Node.js and Object Oriented Javascript
我正在创建一个游戏,该游戏允许与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 );
}
}
您至少需要更改:
function UserSocket(sock) {
o = this;
...
对此:
function UserSocket(sock) {
var o = this;
...
你有它的方式, o
是一个隐含的全局变量。 如果有人第二次调用new UserSocket()
,则将覆盖o
的值,然后第一个套接字将无法正常工作。
在Javascript中,仅打算在函数中使用的所有变量都应在其首次声明时以var
开头。 如果不考虑这一点,那么它们将成为“隐式全局变量”,您的所有代码都可以访问它们,并且会无意间被覆盖。 隐式全局变量是一种不良的编码习惯,通常会导致错误,实际上,如果以严格模式运行代码,则会导致错误,并且代码甚至无法运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.