2015-12-15 79 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();