如果尚未定义全局变量,如何在函数中使用该变量



嗨,

我有一个套接字应用程序,在app.js:中定义了这个文件结构

require("../chat/variables");
require("../chat/functions");
require("../chat/connect");
app.get('/', function (req, res, next) {
res.sendFile(__dirname + '/index.html');
});
httpServer.listen(port, () => {
console.log(`Socket.IO server running`);
});  

变量文件如下所示:

// server
app = require("express")();
httpServer = require("https").createServer({},app);
io = require("socket.io")(httpServer, {      //socket server path
path: "/"
});

函数文件是这样的:

makesession = function(vdata) {   //store user data for this session
if(socket) {
socket.userid = vdata.userid;
socket.username = vdata.name;
}
});

为每个用户执行连接的文件如下所示:

io.on('connection', (socket) => {   //user connects to socket
memberdata().then(v => {
makesession(v);
});
});   

但是我在函数文件中得到一个错误,说套接字没有定义。为什么?我认为使用if条件就足够了,所以它只在定义了套接字之后才会触发。

谢谢。

尝试添加套接字作为makesession的参数,如下所示:

makesession = function(socket, vdata) {   //store user data for this session
if(socket) {
socket.userid = vdata.userid;
socket.username = vdata.name;
}
});

io.on('connection', (socket) => {   //user connects to socket
memberdata().then(v => {
makesession(socket, v);
});
});

在原始代码中,socket没有在makesession中定义,因为套接字是回调中的局部(而不是全局)变量。Javascript使用词法作用域,而不是动态作用域,因此回调中的变量在makesession中不可见。