【发布时间】:2012-04-26 18:37:09
【问题描述】:
我只是想确认我的怀疑。
我偶然发现了一篇文章,它建议以下列方式使用 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 不再在范围内。
首先,我对创建函数的怀疑是真的吗?其次,如果是这样,有没有办法让socket 在命名函数的范围内?
【问题讨论】:
-
我不熟悉 V8 内部结构,但它可能足够聪明,可以编译一次函数并每次都重新使用它,只是附加了不同的范围。
-
@ThiefMaster:根据 V8 邮件列表中的一位技术人员,是的,它“通常”是;见my answer to KPthunder's other question。
标签: javascript node.js scope socket.io