Jas*_*onY 5 javascript singleton node.js
对于我的项目,我有很多函数对单个全局变量进行更改,但是由于文件非常大,我想将这些函数拆分为不同的模块。但是,当传递全局变量时,它会创建另一个实例。有没有办法防止这种情况?
例如,这是所需的输出:
var global_var=1;
function first_function(){
console.log(++global_var);
}
function second_function(){
console.log(++global_var);
}
first_function(); //outputs 2
second_function(); //outputs 3
first_function(); //outputs 4Run Code Online (Sandbox Code Playgroud)
但是当试图将 first_function 和 second_function 分成不同的模块时,
//in main.js file
var global_var=1;
var first_function=require(./first_function)(global_var);
var second_function=require(./second_function)(global_var);
first_function(); //outputs 2
second_function(); //outputs 2
first_function(); //outputs 2
//in first_function.js and second_function.js
module.exports=function(global_var){
return ++global_var;
}Run Code Online (Sandbox Code Playgroud)
我不想在每次进行函数调用时重新分配或重新传输 global_var,因为更改 global_var 的函数调用每分钟进行数千次,而 global_var 是一个具有 1000 多个键的对象。
有没有办法确保子模块在不传递全局对象的情况下修改全局对象的相同实例?
如果该代码(在我猜测的示例中进行了简化)按照您说的做,我会感到非常惊讶。这个:
var first_function=require(./first_function)(global_var);
Run Code Online (Sandbox Code Playgroud)
传递global_var(顺便说一下,它不是全局的,因为它是用 定义的var)到导出的函数中。导出的函数返回该值递增 1。所以当你调用它时:
first_function();
Run Code Online (Sandbox Code Playgroud)
您实际上应该得到一个错误,即数字不是函数。
有很多方法可以解决这个问题。由于您的变量是一个对象,因此无论在何处使用它,它都可以通过引用获得,这意味着更新一个实例应该更新所有实例。
解决方案一:使 first_function.js 导出一个返回函数的函数。
//in first_function.js and second_function.js
module.exports=function(global_var){
// This function will be the value of "first_function"
// when you require it and pass in "global_var"
return function() {
return ++global_var;
};
};
Run Code Online (Sandbox Code Playgroud)
解决方案 2:使用实际的全局变量。
global.someVar = 1;
// first_function.js
module.exports = function() {
return ++global.someVar;
};
Run Code Online (Sandbox Code Playgroud)
这里需要注意的是,全局变量通常被认为是代码异味(不好的做法)。
解决方案 3:使变量成为文件的导出。导出被缓存,再次通过引用,因此需要该变量的每个文件将获得相同的引用。
// global_var.js
exports.global_var = 1;
// first_function.js
var glob = require('./global_var');
module.exports = function() {
return ++glob.global_var;
};
Run Code Online (Sandbox Code Playgroud)