javascript - 在 Node.js 中,有没有办法从所需模块访问父级的变量范围?

标签 javascript node.js singleton

对于我的项目,我有很多函数对单个全局变量进行更改,但由于文件非常大,我想将这些函数拆分到不同的模块中。但是,在传递全局变量时,它会创建另一个实例。有什么办法可以防止这种情况发生吗?

例如,这是所需的输出:

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 4

但是当试图将 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;

}

我不想每次调用函数时都重新分配或重新传输 global_var,因为更改 global_var 的函数调用每分钟进行数千次,而 global_var 是一个具有超过 1000 个键的对象。

有没有办法确保子模块修改全局对象的同一个实例而不传递它?

最佳答案

如果该代码(在我猜测的示例中进行了简化)按照您所说的进行操作,我会感到非常惊讶。这:

var first_function=require(./first_function)(global_var);

global_var(顺便说一句,它不是全局的,因为它是用 var 定义的)传递给导出的函数。导出的函数返回该值加一。所以当你调用它时:

first_function();

你实际上应该得到一个数字不是函数的错误。

有很多方法可以解决这个问题。由于您的变量是一个对象,因此无论在何处使用它,它都可以通过引用 获得,这意味着更新一个实例应该更新所有实例。

解决方案 1:让 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;
  };
};

解决方案 2:使用实际全局变量。

global.someVar = 1;

// first_function.js
module.exports = function() {
  return ++global.someVar;
};

这里需要注意的是,全局变量通常被认为是代码异味(不好的做法)。

解决方案 3:使变量成为文件的导出。再次通过引用缓存导出,因此需要该变量的每个文件都将获得相同的引用。

// global_var.js
exports.global_var = 1;

// first_function.js
var glob = require('./global_var');
module.exports = function() {
  return ++glob.global_var;
};

关于javascript - 在 Node.js 中,有没有办法从所需模块访问父级的变量范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29943088/

相关文章:

design-patterns - "Brokered definition set"设计模式——众所周知的另一个名字?

java - Servlet 中的单例和 Tomcat7 上的其他类

javascript - Bootbox:如何添加 'prompt'

javascript - 你能引用一个在 ngOnInit 中创建的函数吗?

node.js - 通过 Node 客户端调用Google API时出现"socket hang up"错误

javascript - 如何在 SailsJS 中有选择地包含 javascript Assets ?

javascript - lodash 合并一个对象

javascript - 为什么使用cloneNode()时<select>元素的值会重置?

javascript - 从 Node JS 中的生成器获取返回值

java - 在原型(prototype) bean 中使用 Spring singleton-bean。会发生什么?