亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號