Объект Javascript: область видимости переменной экземпляра

0

Интересно, может ли кто-нибудь помочь мне. Исходя из Java, C++ фона, я пытаюсь написать аккуратную реализацию OO в Javascript. Я использую следующий шаблон с Socket.io.

В функции прослушивания переменные экземпляра правильно определены в первом предупреждении. Переменная экземпляра x выходит за пределы области действия в прослушивателе событий socket.on, и обе переменные экземпляра выходят из области действия в JQuery $.each

Может кто-нибудь объяснить, что здесь происходит?

var Player = (function () {

this.x  = "";

//Constructor
var Player = function() {
    // connect to the server
    this.x = "somevalue";
    this.socket  = io.connect();

};


Player.prototype = {
    constructor: Player,
    listen: function() {
     alert(this.x + " " + this.socket);           // fine get somevalue & [object, object]
     this.socket.on('event', function(data) {
        alert(this.x + " " + this.socket);        // this.x undefined this.socket [object, object]
        $.each(data, function(index,value) { 
           alert(this.x + " " + this.socket);     // undefined undefined  
        });
     });  
    }

return Player;
})();
Теги:
scope
oop
socket.io

1 ответ

2

this в вашем случае и .each() функции обратного вызова не совпадает с this, где вы определили x и socket. Когда эти функции обратного вызова вызывается библиотекой Socket.io и jQuery (соответственно), обычно предоставляется значение this в этих функциях обратного вызова.

Чтобы решить эту проблему, ваша функция listen должна выглядеть скорее:

listen: function() {
 var that = this; // <-- keep a reference to your module
 alert(that.x + " " + that.socket);           // fine get somevalue & [object, object]
 that.socket.on('event', function(data) {
    // in here, this could vary depending on the event
    alert(that.x + " " + that.socket);        // this.x undefined this.socket [object, object]
    $.each(data, function(index,value) { 
       // in here, this = the current data element
       alert(that.x + " " + that.socket);     // undefined undefined  
    });
 });  
}
  • 0
    Спасибо за ваш быстрый ответ. Очевидно, я не думал об этом должным образом. Все имеет смысл сейчас ...
  • 0
    @avrono: Добро пожаловать! Об этом легко забыть. Просто помните о том, что this может измениться в зависимости от контекста, в котором он используется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню