use*_*159 10 javascript variables module global-variables node.js
在我的一个JS文件中,我包含另一个.如何在包含的模块中设置变量?
我认为做这样的事情会起作用
var mymodule = require('mymodule.js');
mymodule.myvariable = 'test';
Run Code Online (Sandbox Code Playgroud)
然后在mymodule中
this.myvariable === 'test';
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用undefined.将值传递给模块的各种选项有哪些?我可以将变量作为参数添加到我在mymodule中调用的每个函数中,但这并不理想.
有没有办法在没有全局变量的情况下完成它,这样我就可以在各种必需的模块中独立设置变量,像这样?
var mymodule1 = require('mymodule.js');
var mymodule2 = require('mymodule.js');
mymodule1.myvariable = 'test1';
mymodule2.myvariable = 'test2';
Run Code Online (Sandbox Code Playgroud)
Nom*_*man 16
NodeJS require()将始终加载模块一次,因此您需要在模块中实现作用域,其中模块的不同实例可以以其自己的内部状态存在.
您可以将模块实现为JS类,如:
var MyModule = function(){};
MyModule.prototype.someFunction = function(params){
this.someVar = params;
}
MyModule.prototype.anotherFunction = function(key, value){
this[key] = value;
}
module.exports = MyModule;
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中;
var MyModule = require('MyModule');
someModule = new MyModule();
// treat someModule like an object with its getters/setters/functions
Run Code Online (Sandbox Code Playgroud)
Ada*_*one 12
您正在执行的操作的问题是您在导入后设置变量,但在导入this.myvariable === 'test';模块之前,在设置变量之前调用该变量.
您可以让模块导出一个函数,然后在导入时调用该函数,并将变量作为参数传递.
module.exports = function(myVar) {
var myModule = {
// has access to myVar
...
};
return myModule;
};
Run Code Online (Sandbox Code Playgroud)
导入时
var myModule = require('myModule')(myVar);
Run Code Online (Sandbox Code Playgroud)
如果您使用此方法,请记住,无论您在何处导入,都会获得模块的不同实例,这可能不是您想要的.
如果要从模块外部设置模块的值,一个好的选择是让模块使用setter方法导出对象,并使用它将变量的值设置为对象的属性.这使得您可以更清楚地想要设置此值,而只是myModule.myVar =稍后可以设置您的混淆.
module.exports = {
myVar: null,
setMyVar: function(myVar) {
this.myVar = myVar;
},
...
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,无论您在何处导入模型,都可以访问该模型的同一实例.
编辑以回应评论
在第一个选项中,您显示每次获得不同实例的位置,如何导出多个共享相同myVar的函数?如果该模块导出每个需要myVar的5个函数,我可以在导入时将其设置在一个位置而不是将其传递给每个函数吗?
不完全确定我是否理解你所描述的内容,但你可以这样做:
module.exports = function(myVar) {
var modules = {};
modules.someModule = {...};
modules.anotherModule = {...};
...
return modules;
};
Run Code Online (Sandbox Code Playgroud)
这些子模块中的每一个都可以访问相同的myVar.所以你将导入如上所述,结果将是一个包含你的五个模块作为属性的对象.我不能说这是不是一个好主意,它变得非常复杂,但也许它对你的情况有意义.
应该工作得很好。这是一个工作示例:
索引.js
var module = require('./module.js');
module.myvar = 'Hello world';
module.test();
Run Code Online (Sandbox Code Playgroud)
模块.js
module.exports = {
test: function() {
console.log('var is', this.myvar);
}
};
Run Code Online (Sandbox Code Playgroud)
请记住,如果您this在闭包中使用,则范围不再是模块本身。所以这可能是你的问题。
你能告诉我你使用这个的模块代码部分吗?