引用导出属性的多种方式之间的差异

Difference between multiple ways of referencing exported attribute

本文关键字:方式 之间 属性 引用      更新时间:2023-09-26

我正在使用socket.io,需要导出io对象以便在其他文件中使用。控制器A工作并成功地发出消息。奇怪的是,控制器B和C没有正确引用.io。引用.io的三种方式之间有什么区别吗?

// index.js
exports.register = function (server, options, next) {
    var onlineUsers = {};
    var io = require('socket.io')(server.select('collaboration').listener);
    io.on('connection', function (socket) {
        socket.on('is_online', Handlers.is_online.bind(null, socket));
        socket.on('disconnect', Handlers.is_offline.bind(null, socket));
    });
    exports.io = io;
    next();
};
// controllerA.js
var io = require('./collaboration/index');
function testFunc() {
    io.io.emit('testing', {data: 'some data'});
}
// controllerB.js
var io = require('./collaboration/index').io;
function testFunc() {
    io.emit('testing', {data: 'some data'});
}
// controllerC.js
var index = require('./collaboration/index');
var io = index.io;
function testFunc() {
    io.emit('testing', {data: 'some data'});
}

这与定时有关:只有在调用register()时才会创建exports.io。在此之前,exports.io是未定义的。

这也反映在您的控制器上:

  • CCD_ 6存储对CCD_ 8的CCD_。当您需要index.js时,exports.io还不存在,但这不是问题,因为您稍后在testFunc中引用它(是否意味着必须在testFunc之前调用register(),否则io.io仍然未定义)
  • controllerBcontrollerC在调用require时直接引用exports.io。然而,在那个时候,它还不存在。换句话说,它们正在存储一个未定义的引用,因此它们的testFunc失败

以下是正在发生的事情的简化:

// controllerA
var obj = {};
var io  = obj;
obj.io  = 'hello';
console.log(io.io);
// controllerB
var obj = {};
var io  = obj.io;
obj.io  = 'hello';
console.log(io);
// controllerC
var obj   = {};
var index = obj;
var io    = index.io;
obj.io    = 'hello';
console.log(io);

此日志:

hello
undefined
undefined