2017-07-12 32 views
1

の問題が発生します。問題の原因を突き止めるのに時間がかかりましたが、なぜそれがそのように動作しているのだろうかと思います。同じ名前の変数を宣言すると、ソケットio

このコードを使用すると、プレーヤー、プレーヤー、ソケットの変数が定義されず、エラーが発生します。同じ名前を持つ変数の宣言を回避

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'); 
    } 
}); 

は、それがすべて正常に動作します。

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'); 
    } 
}); 

私は最初のコードを実行したときの興味深い部分は、である、それは私がplayer.gameID=gameID後にあるコードを削除した場合、プレイヤーが定義している間にラインplayer.gameID=gameIDでプレイヤーは、未定義であると言います。基本的に、player.gameID=gameIDの後のコードでは、プレイヤーは定義されませんでした。

これはどうしてですか?

+0

ウムプレーヤーは、コンストラクタである:これはあなたのコードは同等です

巻き上げ呼ばれているのですか?もしそうなら、 'var player = new Player(socket.id、socket);' – magreenberg

答えて

2

var player = players[p];を宣言すると、関数スコープ全体に対して宣言されます(forループにはスコープはありません)。

関数本体を実行する前に、現在のスコープ内の名前がす​​べて最初から評価されます。

function(data)が呼び出された場合、という名前は、var gameID = data;が実行される前であっても、そのスコープで上書きされます。

最小限例:

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

をお試しください:) – Batash

1

Javascriptがそれらが定義された範囲の先頭に変数の宣言を移動し、それらに未定義初期値を与えるが、場所に割り当てを保持します。 、

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'); 
 
    } 
 
});

関連する問題