variables作用域(module.exports + socket.io设置)

我正在使用node.jsexpresssocket.io设置websocket应用程序的基础。 我决定将设置socket.io的代码放在一个单独的模块中将是优雅的,所以我的server.js文件可以更小,调用socket.io安装任务的require

 // 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); }); } 

embedded在index.html的客户端脚本是最小的。

 // client side script var port = 80; var socket = io.connect('http://127.0.0.1:' + port); 

现在到了。 在打开指向localhost新浏览器标签时,服务器login到控制台,增加数量numClients 。 那实际上是如何工作的? 我确定numClients会超出范围,并希望在控制台上看到一个exception。 当绑定到on connection事件的callback函数触发时,它不应该看到numClientsvariables,因为它不是全局的,也不是私人的io对象,对不对? 这里发生了什么事情?

你必须阅读更多关于在JavaScript中的闭包。 在这个特定的例子中,当你启动应用程序时, numClients = 0; 被初始化并保留在匿名function(io)的执行上下文中的内存中。 然后,每当有新的连接时,触发io.on('connection')事件,执行callback, numClients仍然在执行上下文中,这就是为什么你会看到这个var增加。