2015-12-15 73 views
0

我有两个文件。我正在创建一个文件的多个对象到其他文件中。Nodejs:node.js中的对象变量

module1.js

var a = 5; 



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


exports.check = check1; 

module2.js

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

的输出是15 & 25.

当使用VAR声明变量,范围本地。我正在创建module.js的两个实例。那么为什么它会在全球范围内宣布,因为产量是15 & 25?

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

+1

“*本人创建了两个module.js的实例*“ - 不,你不是。所有模块只加载一次。 – Bergi

回答

2

无论何时你做一个require,它都会返回一个对已经加载到内存中的模块的引用(如果有的话)。否则,它将首先加载模块,然后将引用返回给它。更多的信息在docs

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

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(); 
+0

第一个解决方案是无用的,因为你可以直接记录15(没有其他可能的结果)。第二种解决方案与我所展示的类似,但有一个bug ... – Amit

+0

@Amit我认为他不是发布他的真实代码。在他发布的示例代码中,是的,第一个代码没有任何意义。但取决于实际的代码是什么,它可能是一个解决方案。 –

+2

尝试你的代码,看看会发生什么(提示:TypeError:a.check1不是函数) – Amit

1

模块的NodeJS系统利用高速缓存为相同的模块(Reference)的所有引用返回相同的实例。

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

如果你想有2种独立的情况下,尝试这样的:

module1.js

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

exports.Check = Check; 

module2.js

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