我正在使用node.js
,express
和socket.io
为websocket应用设置基础。我决定将设置socket.io
的代码放在一个单独的模块中会很优雅,因此我的server.js
文件可能更小,调用require
来设置socket.io
设置职责。
// server.js
// set up ======================================================================
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 80;
// routes ======================================================================
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
// socket.io controller ========================================================
require('./app/ws-controller.js')(io);
// launch ======================================================================
server.listen(port, function () {
console.log('Server listening on port ' + port + '!');
});
在我的ws-controller.js
文件中,我放置了一些代码,开始尝试使用socket.io
。
// app/ws-controller.js
module.exports = function(io) {
var numClients = 0;
io.on('connection', function (socket) {
numClients++;
console.log(numClients);
});
}
index.html
中嵌入的客户端脚本很少。
// client side script
var port = 80;
var socket = io.connect('http://127.0.0.1:' + port);
现在到了这一点。打开指向localhost
的新浏览器选项卡后,服务器将登录到控制台,增加号码numClients
。这实际上是如何工作的?我确信numClients
超出了范围,并且预计会在控制台上看到异常。当绑定到on connection
事件的回调函数触发时,它不应该看到numClients
变量,因为它不是全局的,也不是io
对象的私有,对吧?这里究竟发生了什么?
答案 0 :(得分:1)
您必须在javascript中阅读有关闭包的更多信息。在此特定示例中,当您引导应用程序时,numClients = 0;
已初始化并保留在匿名function(io)
的执行上下文中的内存中。然后,每次有新连接时,触发io.on('connection')
事件,执行回调,numClients
仍然在执行上下文中,这就是为什么你会看到这个var增加的原因。