Javascript Nodejs:node.js中的对象变量

Javascript Nodejs:node.js中的对象变量,javascript,node.js,Javascript,Node.js,我有两个文件。我正在将一个文件的多个对象创建到另一个文件中 module1.js var a = 5; var check1 = function(){ a = a + 10; console.log(a); } exports.check = check1; var c = require('../module1'); var d = require('../module1'); c.check(); d.check(); function Check() {

我有两个文件。我正在将一个文件的多个对象创建到另一个文件中

module1.js

var a = 5;



var check1 = function(){
    a = a + 10;
    console.log(a);
}


exports.check = check1;
var c = require('../module1');
var d = require('../module1');
c.check();
d.check();
function Check() {
  var a = 5;
  return {
    check: function() {
      a = a + 10;
      console.log(a);
    }
  };
}

exports.Check = Check;
var Check = require('../module1').Check;
var c = Check();
var d = Check();
c.check();
d.check();
module2.js

var a = 5;



var check1 = function(){
    a = a + 10;
    console.log(a);
}


exports.check = check1;
var c = require('../module1');
var d = require('../module1');
c.check();
d.check();
function Check() {
  var a = 5;
  return {
    check: function() {
      a = a + 10;
      console.log(a);
    }
  };
}

exports.Check = Check;
var Check = require('../module1').Check;
var c = Check();
var d = Check();
c.check();
d.check();
输出为15&25

使用var声明变量时,作用域是局部的。我正在创建module.js的两个实例。那么为什么它会在全球层面上被宣布,因为它的输出是15&25


我需要输出为15和15,因为我想使用这个变量作为对象级变量。我该怎么办?

每当您执行
要求时,它都会返回对已加载到内存中的模块的引用(如果有)。否则,它将首先加载模块,然后返回对它的引用。更多信息请访问

所以,两个变量实际上都指向同一个对象。您可以通过
require
ing任何模块来验证这一点

var a = require('http');
var b = require('http');
console.log(a==b); // true
这是为了防止在加载循环依赖项时出现无限循环

根据您模块的代码,您可以做几件事来解决此问题

您可以在函数中移动变量定义,例如:

var check1 = function(){
    var a = 5;
    a = a + 10;
    console.log(a);
}

exports.check = check1;
或者,您可以编写一个函数,在每次调用时创建一个新对象

var create = function () {
    var a = 5;
    var check1 = function(){
        a = a + 10;
        console.log(a);
    }
    return {
        check1: check1
    }
}


exports.create = create;
在主文件中:

// or you can store require('./module1') to a single variable
var a = require('./module1').create();
var b = require('./module1').create();

a.check1();
b.check1();

无论何时执行
require
,它都会返回对已加载到内存中的模块的引用(如果有)。否则,它将首先加载模块,然后返回对它的引用。更多信息请访问

所以,两个变量实际上都指向同一个对象。您可以通过
require
ing任何模块来验证这一点

var a = require('http');
var b = require('http');
console.log(a==b); // true
这是为了防止在加载循环依赖项时出现无限循环

根据您模块的代码,您可以做几件事来解决此问题

您可以在函数中移动变量定义,例如:

var check1 = function(){
    var a = 5;
    a = a + 10;
    console.log(a);
}

exports.check = check1;
或者,您可以编写一个函数,在每次调用时创建一个新对象

var create = function () {
    var a = 5;
    var check1 = function(){
        a = a + 10;
        console.log(a);
    }
    return {
        check1: check1
    }
}


exports.create = create;
在主文件中:

// or you can store require('./module1') to a single variable
var a = require('./module1').create();
var b = require('./module1').create();

a.check1();
b.check1();

NodeJS模块系统使用缓存为对同一模块()的所有引用返回同一实例

这将导致代码在
c
d
中具有相同的对象实例

如果希望有两个单独的实例,请尝试以下操作:

module1.js

var a = 5;



var check1 = function(){
    a = a + 10;
    console.log(a);
}


exports.check = check1;
var c = require('../module1');
var d = require('../module1');
c.check();
d.check();
function Check() {
  var a = 5;
  return {
    check: function() {
      a = a + 10;
      console.log(a);
    }
  };
}

exports.Check = Check;
var Check = require('../module1').Check;
var c = Check();
var d = Check();
c.check();
d.check();
module2.js

var a = 5;



var check1 = function(){
    a = a + 10;
    console.log(a);
}


exports.check = check1;
var c = require('../module1');
var d = require('../module1');
c.check();
d.check();
function Check() {
  var a = 5;
  return {
    check: function() {
      a = a + 10;
      console.log(a);
    }
  };
}

exports.Check = Check;
var Check = require('../module1').Check;
var c = Check();
var d = Check();
c.check();
d.check();

NodeJS模块系统使用缓存为对同一模块()的所有引用返回同一实例

这将导致代码在
c
d
中具有相同的对象实例

如果希望有两个单独的实例,请尝试以下操作:

module1.js

var a = 5;



var check1 = function(){
    a = a + 10;
    console.log(a);
}


exports.check = check1;
var c = require('../module1');
var d = require('../module1');
c.check();
d.check();
function Check() {
  var a = 5;
  return {
    check: function() {
      a = a + 10;
      console.log(a);
    }
  };
}

exports.Check = Check;
var Check = require('../module1').Check;
var c = Check();
var d = Check();
c.check();
d.check();
module2.js

var a = 5;



var check1 = function(){
    a = a + 10;
    console.log(a);
}


exports.check = check1;
var c = require('../module1');
var d = require('../module1');
c.check();
d.check();
function Check() {
  var a = 5;
  return {
    check: function() {
      a = a + 10;
      console.log(a);
    }
  };
}

exports.Check = Check;
var Check = require('../module1').Check;
var c = Check();
var d = Check();
c.check();
d.check();

“我正在创建module.js的两个实例”-不,你没有。所有模块只加载一次。“我正在创建module.js的两个实例”-不,你没有。所有模块只加载一次。第一个解决方案非常无用,因为您可以直接记录15(没有其他可能的结果)。第二个解决方案与我展示的类似,但有一个bug…@Amit我认为他没有发布真正的代码。在他发布的示例代码中,是的,第一个代码没有任何意义。但这取决于实际代码是什么,它可能是一个解决方案。请尝试您的代码,看看会发生什么(提示:TypeError:a.check1不是函数)@Amit谢谢您指出这一点。我修正了:)第一个解决方案是非常无用的,因为您可以直接记录15(没有其他可能的结果)。第二个解决方案与我展示的类似,但有一个bug…@Amit我认为他没有发布真正的代码。在他发布的示例代码中,是的,第一个代码没有任何意义。但这取决于实际代码是什么,它可能是一个解决方案。请尝试您的代码,看看会发生什么(提示:TypeError:a.check1不是函数)@Amit谢谢您指出这一点。我修好了:)