knp*_*wrs 2 javascript scope node.js socket.io
我只是想证实我的怀疑.
我偶然发现了一篇建议以下列方式使用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
});
});
Run Code Online (Sandbox Code Playgroud)
我觉得以下会更好地利用资源:
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
}
Run Code Online (Sandbox Code Playgroud)
我的感觉是,虽然处理该匿名函数connection事件只在内存中创建一次,即处理匿名函数action1,action2以及disconnect在内存中创建的每一个套接字连接.第二种方法的问题socket是不再适用范围.
首先,我怀疑函数的创建是真的吗?其次,如果有办法进入socket命名函数的范围?
使用闭包有助于保持范围清洁:
io.sockets.on('connection', function () {
function action1(data) {
// logic for action1
}
function action2(data) {
// logic for action2
}
function disconnect() {
// logic for disconnect
}
return function (socket) {
socket.on('action1', action1);
socket.on('action2', action2);
socket.on('disconnect', disconnect);
}
}()); // <- note the immediate function call
Run Code Online (Sandbox Code Playgroud)
对你的问题:
首先,我怀疑函数的创建是真的吗?
是.上面的闭包方法可以防止这种情况,回调函数只创建一次.另外:所有人都看到了正确的父范围.
其次,如果有办法进入
socket命名函数的范围?
在socket将作为this在回调.