Javascript将变量传递给require模块
我有一个类似foo.js的文件Javascript将变量传递给require模块,javascript,Javascript,我有一个类似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 f
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
方法接受变量,以便将x
传递到foo.foo()
类似foo.foo(x)
?您可以这样做
// 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”代码>可以将x
隐式绑定到另一个函数可以访问的窗口
这些对象在所有模块中都可用。这些对象中的一些实际上不在全局范围内,而是在模块范围内——这将被注意到
说。它还说,在全球范围内:
在浏览器中,顶级作用域是全局作用域。这意味着在浏览器var中,将定义一个新的全局变量。在Node.js中,这是不同的。顶层范围不是全局范围var Node.js模块中的某些内容将是该模块的本地内容
:
模块包装器
在执行模块代码之前,Node.js将使用如下所示的函数包装器对其进行包装:
(函数(导出、要求、模块、文件名、目录名){
//模块代码实际上就住在这里
});
通过这样做,Node.js实现了以下几点:
- 它将顶级变量(用
var
、const
或let
定义)的范围限定在模块而不是全局对象
- 它有助于提供一些实际特定于模块的全局变量,例如:
模块
和导出实现者可用于从模块导出值的对象
- 方便变量
\uuu filename
和\uuu dirname
,包含模块的绝对文件名和目录路径
这就是为什么要为导出指定一个值
解决
模块工厂
您应该返回一个包装函数,该函数接受以任何形式提供它的参数
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.
};
};
};
var x = "Hi",
// call that factory function passing "x"
foo = require("./foo")(x).foo;
foo();
var x = "Hi",
foo = require("./foo");
global.x = x;
foo();
main.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.
};
};
};
var x = "Hi",
// call that factory function passing "x"
foo = require("./foo")(x).foo;
foo();
var x = "Hi",
foo = require("./foo");
global.x = x;
foo();
注意,它使用module.exports
,因为exports=…
单独将仅替换NodeJS围绕模块代码的函数参数中的引用(请参见上面的链接),而module.exports=…
替换导出模块的属性
见:
它允许一个快捷方式,因此module.exports.f=…
可以更简洁地编写为exports.f=…
。但是,请注意,与任何变量一样,如果将新值分配给导出
,它将不再绑定到模块。导出
:
[……]
将x
分配给global
这只是为了完整性,不要这样做。
- 这将使人们更难理解哪些参考文献来自哪里
- 您可能会意外地用其他模块定义的相同名称覆盖其他全局变量
main.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.
};
};
};
var x = "Hi",
// call that factory function passing "x"
foo = require("./foo")(x).foo;
foo();
var x = "Hi",
foo = require("./foo");
global.x = x;
foo();
现在x
是在global
对象上定义的,因此在任何模块中都“神奇地”可用。这可能会对您有所帮助,但您是否希望将方法传递到另一个文件?谢谢大家的评论!如果你能指出OP的方法不起作用的原因,并且你的方法和OP的方法加上论点在技术上没有区别,那就太好了。请不要用带相关信息的反问题回答问题。最好指出错误所在,以及节点按其工作方式工作的原因。谢谢。我在问OP是否有不将变量传递给函数的特定原因,同时也提供了示例。我这样做是为了防止在评论中发布问题,然后在得到澄清后在回答中重新编写和重新发布相同的内容。除了覆盖和管理问题外,在使用“全局”方法时,还有什么更重要的问题需要我注意吗?我走上了一条道路,这是唯一的解决办法,在我的情况下,但我想确保我知道所有的下跌方面。谢谢