2017-07-12 4 views
1

Es dauerte eine Weile, um herauszufinden, was das Problem war, aber ich frage mich, warum es so verhält.deklarieren Variable mit dem gleichen Namen verursacht Probleme in der Steckdose io

Mit diesem Code werden die Variablen Player, Player und Socket nicht definiert, was zu Fehlern führt.

var player = Player(socket.id, socket); 

socket.on('joinHost', function(data) { 
    var gameID = data; 
    player.gameID=gameID; 
    var game = GAME_LIST[gameID]; 
    game.players[socket.id]=player; 
    var players = game.players; 
    for (var p in players){ 
     var player = players[p]; 
     var socket = player.socket; 
     socket.emit('playerJoined'); 
    } 
}); 

Durch die Vermeidung der Deklarationen von Variablen mit demselben Namen wird alles korrekt ausgeführt.

var player = Player(socket.id, socket); 

socket.on('joinHost', function(data) { 
    var gameID = data; 
    player.gameID=gameID; 
    var game = GAME_LIST[gameID]; 
    game.players[socket.id]=player; 
    var tempPlayers = game.players; 
    for (var p in tempPlayers){ 
     var tempPlayer = tempPlayers[p]; 
     var tempSocket = tempPlayer.socket; 
     tempSocket.emit('playerJoined'); 
    } 
}); 

Der interessante Teil ist, wenn ich den ersten Code lief, es sagt der Spieler in der Linie player.gameID=gameID nicht definiert ist, während, wenn ich den Code entfernt, die nach player.gameID=gameID ist, wurde der Spieler festgelegt. Grundsätzlich hat der Code nach player.gameID=gameID dazu geführt, dass der Player nicht definiert war.

Also, warum passiert das?

+0

Umm, ist Spieler einen Konstruktor? Wenn ja, versuche 'var player = neuer Player (socket.id, socket);' – magreenberg

Antwort

2

Wenn Sie var player = players[p]; deklarieren, wird es für den gesamten Funktionsumfang deklariert (die for-Schleife hat keinen eigenen Bereich).

Die Namen im aktuellen Bereich werden alle vor Beginn des Funktionskörpers ausgewertet.

Wenn also function(data) aufgerufen wird, wird der Name player in diesem Bereich überschrieben, noch bevor var gameID = data; ausgeführt wird.

Ein minimales Beispiel:

> var x = 'foo'; 
> f = function() { console.log(x); var x = 'bar'; } 
> f() 
undefined 
+0

Danke für die Erklärung :) – Batash

1

Javascript Variablen Erklärung an die Spitze des Bereichs bewegt sie definiert wurden und gibt ihnen einen undefined Anfangswert, sondern hält Zuweisung an seinem Platz. Dies wird genannt

Ihr Code Hissen entspricht:

var player = Player(socket.id, socket); 
 

 
socket.on('joinHost', function(data) { 
 
    var gameID; // undefined 
 
    var game;  // undefined 
 
    var players; // undefined 
 
    var player; // undefined 
 
    var socket; // undefined 
 
    
 
    gameID = data; 
 
    player.gameID=gameID; // can't set property 'gameID' of undefined 
 
    game = GAME_LIST[gameID]; 
 
    game.players[socket.id]=player; // is undefined since 'player' is undefined at this stage 
 
    players = game.players; // undefined 
 
    for (var p in players){ 
 
     player = players[p]; 
 
     socket = player.socket; 
 
     socket.emit('playerJoined'); 
 
    } 
 
});

Verwandte Themen