Javascript 将变量传递给 require 模块



我有一个文件foo.js像这样

var foo = function() {
console.log(x + 'foo'); // I want my module that require/import to pass into this file.
};
exports.foo = foo;

然后我有另一个文件 main.js,我想从这里将一个变量传递给 foo.js。可能吗?

var x = 'Hi, '; // I want to pass this to the module foo.js. Is it possible?
var foo = require('./foo');
foo.foo(); // I want to see "Hi, foo"

任何指示将不胜感激!

你可以做这样的事情

// foo.js
module.exports = {
foo: function (x) {
console.log(x + 'foo');
}
}
// main.js
var foo = require('./foo');
var x = 'Hi';
foo.foo(x);

了解 NodeJS 作用域和模块

NodeJS 不提供在浏览器中隐式存储变量(如window(的全局对象。在浏览器中,var x = "Hi";whould 隐式地将x绑定到另一个函数可以访问的window

这些对象在所有模块中都可用。其中一些对象实际上不在全局范围内,而是在模块范围内 - 这将被注意。

NodeJS文档说。它进一步说明了全局global对象:

在浏览器中,顶级作用域是全局作用域。这意味着在浏览器中var something将定义一个新的全局变量。在 Node 中.js这是不同的。顶级作用域不是全局作用域; Node.js 模块内的var something将是该模块的本地模块。

关于模块的 NodeJS 文档:

模块包装器

在执行模块的代码之前,Node.js 将使用如下所示的函数包装器包装它: (函数(导出、要求、模块、__filename、__dirname( { 模块代码实际上就在这里 });

通过这样做,Node.js实现了几件事:

  • 它保留顶级变量(用varconstlet定义(的作用域为模块而不是全局对象。
  • 它有助于提供一些实际上特定于模块的全局变量,例如:
    • 实现者可用于从模块导出值的moduleexports对象。
    • 方便变量__filename__dirname,包含模块的绝对文件名和目录路径。

这就是您为exports分配值的原因。

解决 方案

模块工厂

您应该返回一个包装函数,该函数接受

在任何foo.js:

// Export a function that establishes a new scope providing "x"
module.exports = function(x) {
return {
foo: function() {
console.log(x + 'foo'); // I want my module that require/import to pass into this file.
};
};
};

主.js:

var x = "Hi",
// call that factory function passing "x"
foo = require("./foo")(x).foo;
foo();

请注意,它使用module.exports,因为单独exports = ...只会替换 NodeJS 包装模块代码的函数参数中的引用(请参阅上面的链接(,而module.exports = ...替换导出模块的属性。

请参阅有关差异的 NodeJS 文档:

它允许快捷方式,以便module.exports.f = ...可以更简洁地编写为exports.f = ...。但是,请注意,像任何变量一样,如果将新值分配给exports,则它不再绑定到module.exports

[...]

x分配给global

这只是为了完整起见,不要这样做。

  • 这将使理解哪些引用来自何处变得更加困难。
  • 您可能会意外覆盖其他模块定义的同名的其他全局变量。

主.js:

var x = "Hi",
foo = require("./foo");
global.x = x;
foo();

现在x是在global对象上定义的,因此在任何模块中都"神奇地"可用。

为什么不让foo方法接受变量,以便x传递到像foo.foo(x)这样的foo.foo()

最新更新