我只是想证实我的怀疑。
我偶然发现了一篇文章,它建议以下列方式使用 Socket.io:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
app.listen(8080);
// Some unrelated stuff
io.sockets.on('connection', function (socket) {
    socket.on('action1', function (data) {
        // logic for action1
    });
    socket.on('action2', function (data) {
        // logic for action2
    });
    socket.on('disconnect', function(){
        // logic for disconnect
    });
});
我觉得以下会更好地利用资源:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
app.listen(8080);
// Some unrelated stuff
io.sockets.on('connection', function (socket) {
    socket.on('action1', action1);
    socket.on('action2', action2);
    socket.on('disconnect', disconnect);
});
function action1(data) {
    // logic for action1
}
function action2(data) {
    // logic for action2
}
function disconnect() {
    // logic for disconnect
}
我的感觉是,虽然处理connection事件的匿名函数只在内存中创建一次,但处理action1,action2和的匿名函数是disconnect为每个套接字连接在内存中创建的。第二种方法的问题socket是不再在范围内。
那么首先,我对创建函数的怀疑是真的吗?其次,如果是这样,有没有办法进入socket命名函数的范围?