簡體   English   中英

Node - 為什么導入的模塊不能訪問全局變量?

[英]Node - Why can't imported modules access global variables?

我最近開始使用 ES6 並將我的代碼正確地划分為多個文件以提高可讀性和更容易的版本控制,但我遇到了一個我不確定是否有意或我遺漏了什么的問題。

我有一個 class 存儲在與我的主腳本 (main.js) 分開的文件 (class.js) 中,並通過 module.exports 導出。 在 main.js 中,需要 class.js,我用它來創建它所包含的 class 的一些實例。 在 main.js 中,我有一個定期更新的全局變量,比如說 connectedPlayers。 在我的 class.js 方法之一中,我有 usersOnline(),它應該簡單地返回全局變量 connectedPlayers 的值。 但是,當我嘗試執行此操作時,會拋出一個未定義 connectedPlayers 的錯誤。 我的印象是,由於調用 users.online 的 object 是在 main.js 中定義的,它的 usersOnline() 方法會在 main.js 中查找 connectedPlayers,而不是 class.js ......這是正確的想法嗎? 如果我在這個概念上是正確的,那么為什么我不能訪問 connectedPlayers? 如果我的想法不正確,如何從 class 內部訪問 connectedPlayers?

請注意,這些都是占位符,實際上我在 main.js 中有很多全局變量,我需要 class.js 中的方法來訪問它們。 這些全局變量也會定期更改,因此我不一定將它們傳遞給構造函數,也不想在每次調用我想使用的任何方法時都提供它們。 我敢肯定有更好的方法來做到這一點,但如何?

為了進一步澄清,我希望獲得的功能類似於 JS 導入在瀏覽器中的工作方式,一旦您導入代碼,它就像您將該代碼塊連接到您要從中導入的代碼一樣。 雖然我知道這不是它在節點中的工作方式,但我認為在 main.js 中定義我的 class 的實例基本上會調用 object 中的方法(在 scope 中,我的理解是有缺陷的)

偽代碼:

//class.js
class 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.js
var 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 中,但在我的實際應用程序中我不能這樣做。

代碼會有所幫助,但假設我理解正確,你有一些偽代碼,例如:

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 沒有指向主 class 的鏈接。 僅僅因為 object 在 main.js 中初始化並不意味着 object 知道在它之外發生了什么。 您需要在創建時告訴 Object,它是什么的一部分。 一種常見的方法是傳遞主 class 的“上下文”。 (里程會有所不同)

constructor(context){
  this.name = "foo";
  this.main = context;
}

---

var class1 = new Class(this);

現在在創建 class 時,它知道當它被要求運行它的 usersOnline() function 時應該引用哪個 object。

請注意,與我列出的方法相比,有更優雅的方法可以做到這一點,但我列出的方法希望能表明通常以更優雅的方式實現的想法, 請參閱此答案以獲取另一種方法和更多鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM