有没有办法在JavaScript中跨文件创建全局对象?

时间:2019-04-06 08:42:36

标签: javascript node.js

我又回来了。我想到了一些我想在多个文件之类的代码。这样,我需要声明一个对象,该对象可以跟踪所有内容,例如数组,计数变量以及在整个项目中需要访问和编辑的内容。

因此,我有一个文件,用于声明各种对象。我们在树中将此文件称为Constants.js

Main.js
Constants.js
Secondary.js

我要在Constants.js中声明一个对象,然后在主文件中需要该对象。之后,我需要使用全局对象在Secondary.js中运行一个函数,并在其中进行编辑。问题是,如果我在辅助文件中声明它并对其进行编辑,它将与Main.js文件中的它不一样(或更新)吗?

好的,我的Constants.js文件的布局如下所示-

// Constants.js
exports.Tools = {
  Stack: [],
  Test: "foo",
  Track: 0
  // ...
};

Main.js中,我需要使用以下代码对该对象进行编辑,并编辑其中的内容-

// Main.js
const Constants = require("./Constants.js");
const Tools     = Constants.Tools;

Tools.Stack.push("Some stuff");

之后,我想运行一个函数,就像这样-

// Main.js
require("./Secondary.js").run(Tools);

然后,在函数运行后,Tools对象需要更新Secondary.js:run()对它的操作。例如-

// Secondary.js
exports.run = function (Tools) {
  Tools.Test = "bar";
  Tools.Track++;
}

因此,我希望使用Secondary.js对主文件中的新值进行更新。

在不使用该对象或地图中的函数的情况下,是否有可能发生这种情况?我希望它是一个普通的对象。

非常感谢。 〜Q

2 个答案:

答案 0 :(得分:3)

在主文件中声明全局变量 Main.js

 global.Tools = {
  Stack: [],
  Test: "foo",
  Track: 0
  // ...
};

在Secondary.js中,只需将该变量用作

global.Tools.Stack.push(value)

在Node.js中,全局对象在所有模块中都可用,可以直接使用, 无需导入任何文件。

答案 1 :(得分:0)

好的,我一直在做一些挖掘工作,下面的示例有效-

// Constants.js
exports.Tools = {
  Test:  "foo",
  Stack: []
};
// Secondary.js
exports.run = function (Tools) {
  Tools.Test = "bar";
  Tools.Stack.push("Second");
}

最后,运行的主文件-

// Main.js
const Constants = require("./Constants.js");
const Tools     = Constants.Tools;
Tools.Stack.push("First");
require("./Secondary.js").run(Tools);
console.log(Tools);

/*
 Outputs:
 {
   Test: "bar";
   Stack: ['First', 'Second']
 }
*/

因此,主文件的对象在通过函数时确实会更新。是否在辅助函数中返回该对象也没有关系。

同样,当您不通过函数传递它时,它也会像这样成功运行-

// Secondary.js
exports.run = function () {
  const Tools = require("./Constants.js").Tools;
  Tools.Test = "bar";
  Tools.Stack.push("Second");
}

我希望我能帮助有这个问题的任何人。 〜Q