变量范围(module.exports + socket.io设置)

时间:2016-10-07 08:36:10

标签: javascript node.js express socket.io

我正在使用node.jsexpresssocket.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对象的私有,对吧?这里究竟发生了什么?

1 个答案:

答案 0 :(得分:1)

您必须在javascript中阅读有关闭包的更多信息。在此特定示例中,当您引导应用程序时,numClients = 0;已初始化并保留在匿名function(io)的执行上下文中的内存中。然后,每次有新连接时,触发io.on('connection')事件,执行回调,numClients仍然在执行上下文中,这就是为什么你会看到这个var增加的原因。