我喜欢node.js和socket.io,因为它们非常强大而美丽,但是我的开发几乎没有什么问题阻止我。这可能是因为我没有足够的练习与node.js一起使用javascript。
问题: 有一个代码:
var express = require('express');
var sio = require('socket.io');
var X = require('./js/x.js');
var Y = require('./js/Y.js');
var app = express.createServer();
var ws = sio.listen(app);
var users = [];
app.use(express.static(__dirname + '/public'));
ws.sockets.on('connection', function(socket) {
users.push(new X(socket));
if (users.length === 2) {
var z = new Y(users.shift(), users.shift());
z.listen();
}
});
app.listen(9000);
这是X和Y:
module.exports = function X(socket) {
this.socket = socket;
this.name = '';
X.prototype.setName = function(name) {
this.name = name;
};
};
module.exports = function Y(a, b) {
this.a1 = a;
this.a2 = b;
this.variable1 = 777;
Y.prototype.listen = function() {
this.a1.socket.on('text', function(msg) {
console.log('a1: ' + msg);
// AND HERE IS MY ISSUE:
// I want to access a2 by 'this' but 'this' doesn't point on 'class' Y
this.a2.socket.emit('text', 'a1: ' + msg);
// Also i want to change value of variable, something like that:
this.a1.setName(msg);
// AND:
this.variable1--;
});
};
我的问题是:如何以及我做错了什么。我是PHP开发人员,我知道我的想法有所不同。提前谢谢!
答案 0 :(得分:0)
由于你的回调函数不是Y this
的方法,因此不会引用Y.
Javascript是一种有趣的语言,this
是乐趣的一部分(http://bonsaiden.github.io/JavaScript-Garden/#function.this)。
您可以通过以下方式解决此问题:
Y.prototype.listen = function() {
var that = this;
this.a1.socket.on('text', function(msg) {
console.log('a1: ' + msg);
that.a2.socket.emit('text', 'a1: ' + msg);
that.a1.setName(msg);
that.variable1--;
});
}
看看我刚刚引用的博客文章中复制的这个例子:
它返回5,因为count在闭包函数中被引用为外部变量。但是如果在增量闭包内的count之前添加this.
,结果将为4。这正是出于this
未引用Y的原因。