gpt4 book ai didi

javascript - 多种引用导出属性方式的区别

转载 作者:行者123 更新时间:2023-12-03 08:11:51 25 4
gpt4 key购买 nike

我正在使用 socket.io 并且需要导出 io 对象以在其他文件中使用。 Controller A 工作并成功发出消息。奇怪的是 Controller 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'});
}

最佳答案

这与时间有关:exports.io 仅在调用 register() 时创建。在此之前,exports.io 未定义。

这也反射(reflect)在您的 Controller 中:

  • controllerA 存储对 index.jsexports 对象的引用。当您需要 index.js 时,exports.io 尚不存在,但这不是问题,因为您稍后会在 testFunc 中引用它> (这确实意味着必须在testFunc之前调用register(),否则io.io仍然是未定义);
  • 在调用 require 时,
  • controllerBcontrollerC 直接引用 exports.io。但当时它还不存在。换句话说,它们存储了 undefined reference ,并且它们的 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

关于javascript - 多种引用导出属性方式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34105154/

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