Интересно, может ли кто-нибудь помочь мне. Исходя из 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;
})();
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
});
});
}
this
может измениться в зависимости от контекста, в котором он используется.