0

関数の 1 つで socket.io リスナーを使用して、「敗者」イベントをリッスンし、他のクライアントが勝ったことをクライアントに伝えています。ただし、これはソケット自体を参照するため、socket.on 関数内で「this」キーワードを使用してクライアントについて話すことはできません。私はこれについて間違った方法で進んでいますか?または、super などの別の方法でクライアント オブジェクトにアクセスできますか?

            socket.on('loser', function() {
                //Remove all current objects then restart the game.
                //THIS PART DOESN'T WORK, SINCE 'THIS' NO LONGER REFERS TO 
                //THE GAME OBJECT, BUT INSTEAD REFERENCES THE SOCKET LISTENER.
                for(var i = 0; i < this.board.objects.length; i++)
                {
                    this.board.remove(this.board.objects[i]);
                }
                //WORKS AS EXPECTED FROM HERE ON...
                Game.setBoard(1, new TitleScreen(gameType,
                        "Loser!",
                         "Press Space to Play Again", 
                     playGame));                    
            });
4

3 に答える 3

3

関数は、それらを参照するオブジェクトに関する情報を保持しません.bind()。渡す前に関数をオブジェクトにバインドするために使用できます。

socket.on('loser', function() {
    //Remove all current objects then restart the game.
    //THIS PART DOESN'T WORK, SINCE 'THIS' NO LONGER REFERS TO 
    //THE GAME OBJECT, BUT INSTEAD REFERENCES THE SOCKET LISTENER.
    for (var i = 0; i < this.board.objects.length; i++) {
        this.board.remove(this.board.objects[i]);
    }
    //WORKS AS EXPECTED FROM HERE ON...
    Game.setBoard(1, new TitleScreen(gameType, "Loser!", "Press Space to Play Again",
    playGame));
}.bind(this));
于 2012-12-09T18:12:16.623 に答える
1

ブラウザランドでは、これを行う一般的な方法はvar that = this;、関数に入る前のように変数を設定し、that代わりに使用することです。

ただし、ECMAScript5が導入されたため、価値が失われるbind()のを防ぐことができます。thisもちろん、NodeJSではこれを使用しても安全です(古いブラウザーをサポートする必要があるブラウザーランドとは異なります)。

socket.on('loser', (function() {
    //Remove all current objects then restart the game.
    for (var i = 0; i < this.board.objects.length; i++) {
        this.board.remove(this.board.objects[i]);
    }
    //WORKS AS EXPECTED FROM HERE ON...
    Game.setBoard(1, new TitleScreen(gameType, "Loser!", "Press Space to Play Again", playGame));
}).bind(this));​

詳細については、https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bindを参照してください。

于 2012-12-09T18:12:49.510 に答える
0

このようなもので何が問題なのですか?

var self = this;
socket.on('loser', (function() {
    //Remove all current objects then restart the game.
    for (var i = 0; i < self.board.objects.length; i++) {
        self.board.remove(self.board.objects[i]);
    }
}
于 2012-12-09T22:18:09.013 に答える