【问题标题】:Variable scope (module.exports + socket.io setup)可变范围(module.exports + socket.io 设置)
【发布时间】:2016-10-07 08:36:09
【问题描述】:

我正在使用 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 对象的私有变量,对吧?这里到底发生了什么?

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

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

    【讨论】:

    • 那么当io.on('connection')事件被触发时,回调还是在function(io)的上下文中执行?我认为这将是一个新的,因为 setup 函数被创建、执行和遗忘(至少我是这么认为的)。
    • @Apo 这不是节点模块的情况。当您需要一个模块时,节点将缓存该模块,以便如果另一个文件需要该模块,它将返回相同的实例。这会很有帮助:stackoverflow.com/questions/9210542/…
    • 阅读更多关于闭包的信息,它将帮助您消除疑虑。这是使 JavaScript 如此强大和富有表现力的特性之一。
    • @Svabael - 明白了。您提供的链接确实很有帮助,尤其是 Erik Reppen 不太受欢迎的答案之一,他描述了无闭包环境中的行为。
    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 2015-08-31
    • 2013-11-09
    • 2016-04-30
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多