gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:58 25 4
gpt4 key购买 nike

我正在使用 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 会超出范围,并且预计会在控制台上看到异常。当绑定(bind)到 on connection 事件的回调函数触发时,它不应该看到 numClients 变量,因为它不是全局的,也不是 io 对象私有(private)的,对吗?这里到底发生了什么?

最佳答案

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

关于javascript - 变量范围(module.exports + socket.io 设置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39912936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com