为了账号安全,请及时绑定邮箱和手机立即绑定

Node - 为什么导入的模块不能访问全局变量?

Node - 为什么导入的模块不能访问全局变量?

慕标琳琳 2022-11-11 16:38:53
我最近开始使用 ES6 并将我的代码正确地划分为多个文件以提高可读性和更容易的版本控制,但我遇到了一个我不确定是否有意或我遗漏了什么的问题。我有一个类存储在与我的主脚本 (main.js) 分开的文件 (class.js) 中,并通过 module.exports 导出。在 main.js 中,class.js 是必需的,我使用它来创建它所包含的类的一些实例。在 main.js 中,我有一个定期更新的全局变量,比如说 connectedPlayers。在我的 class.js 方法之一中,我有 usersOnline(),它应该简单地返回全局变量 connectedPlayers 的值。但是,当我尝试执行此操作时,会抛出一个未定义 connectedPlayers 的错误。我的印象是,由于调用 users.online 的对象是在 main.js 中定义的,因此它的 usersOnline() 方法会在 main.js 中查找 connectedPlayers,而不是 class.js ......这是正确的想法吗?如果我在这个概念上是正确的,那么为什么我不能访问 connectedPlayers?如果我'请注意,这些都是占位符,实际上我在 main.js 中有很多全局变量,我需要 class.js 中的方法才能访问它们。这些全局变量也会定期更改,因此我不一定将它们传递给构造函数,也不想在每次调用我想使用的任何方法时都提供它们。我敢肯定有更好的方法来做到这一点,但如何?为了进一步澄清,我希望获得的功能类似于 JS 导入在浏览器中的工作方式,一旦您导入代码,它就像您将该代码块连接到您要从中导入的代码一样。虽然我知道这不是它在节点中的工作方式,但我认为在 main.js 中定义我的类的实例本质上会调用该对象的方法(在 connectedPlayers 的范围内),但我想我的理解是有缺陷的。伪代码://class.jsclass user{    constructor(id){        this.id = id;    }    someOtherMethod(){        ...    }        usersOnline(){        this.someOtherMethod(this.id); //here to show I need the context to still be the obj        return connectedPlayers;    }}//main.jsvar user = require('class.js');var players = {}var connectedPlayers = 0;players[id] = new user(id);console.log(players[id].usersOnline()) //expect to return value of connectedPlayers, but also execute the other function inside of usersOnline properly.另外,在这个例子中,我可以简单地将玩家数量移动到 class.js 中,但在我的实际应用程序中我不能这样做。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

代码会有所帮助,但假设我理解正确,你有一些伪代码,如:


export class Class{

  constructor(){

    this.name = "foo";

  }

  usersOnline(){

   return main.connectedPlayers();

  }

}


-----


require('Class.js');


function connectedPlayers(){

  // stuff...

  return [Object]

}


...

var class1 = new Class();


console.log(class1.name); // correctly gives "foo"

console.log(class1.usersOnline()); // gives main not defined


这是因为 class.js 没有指向主类的链接。仅仅因为对象在 main.js 中被初始化并不意味着对象知道在它之外发生了什么。您需要在创建时告诉对象,它是什么的一部分。一种常见的方法是传递主类的“上下文”。(里程会有所不同)


constructor(context){

  this.name = "foo";

  this.main = context;

}


---


var class1 = new Class(this);

现在在创建时,该类知道当它被要求运行它的 usersOnline() 函数时应该引用哪个对象。


请注意,与我列出的方法相比,有更优雅的方法可以做到这一点,但我列出的方法希望能表明通常以更优雅的方式实现的想法,请参阅此答案以获取另一种方法和更多链接。


查看完整回答
反对 回复 2022-11-11
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信