Я просто хотел подтвердить свое подозрение.Эффективность с обратными вызовами JavaScript
я наткнулся на статью, которая рекомендовала использовать 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
, созданы в память y для каждого соединения сокета. Проблема со вторым подходом заключается в том, что socket
больше не входит в сферу действия.
Итак, во-первых, мое подозрение о создании функций истинно? И во-вторых, если это так, то можно получить socket
в области названных функций?
Я не знаком с внутренними компонентами V8, но он может быть достаточно умным для компиляции функции один раз и повторного использования ее каждый раз, только с другой областью применения. – ThiefMaster
@ThiefMaster: По словам одного из техников в списке рассылки V8, да, это «нормально»; см. [мой ответ на другой вопрос KPthunder] (http://stackoverflow.com/a/10160351/157247). –