2015-12-15 5 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.

При объявлении переменной, используя вар, область действия местный. И я создаю два экземпляра 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 (нет другого возможного результата). Второе решение похоже на то, что я показал, но имеет ошибку ... – Amit

+0

@Почему я думаю, что он не публикует свой настоящий код. В примере кода, который он опубликовал, да, первый не имеет никакого смысла. Но зависит от того, каков фактический код, это может быть решение. –

+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(); 
Смежные вопросы