2015-02-13 6 views
0

Примечание: относительно комментария по аналогичному вопросу Я хотел бы указать, что меня не интересует разница между module.exports и exports. Скорее, мой фокус в этом вопросе заключается в различии между экспортом функции, которая при ее вызове создает объект с функциями, которые мы хотим разделить, и напрямую назначаем эти функции как свойства объекта exports.разница между модулем экспорта идиомы

Я хотел бы понять разницу между следующими двумя способами экспорта функций в качестве модуля (и прячась локальное состояние) в JavaScript:

путь 1

var x = 0; 

function get() {return x;} 

function set(_x) {x = _x;} 

exports.get = get; 
exports.set = set; 

путь 2

module.exports = function() { 
    var x = 0; 

    function get() {return x;} 

    function set(_x) {x = _x;} 

    return {get:get, set:set}; 
}; 

(обратите внимание, что в путь 2 Мне пришлось назначить module.exports, присваивая exports не получилось).

То, как код в пути 1 используется это:

var gs = require('./get-set-a.js'); 

console.log(gs.get()); 
gs.set(100); 
console.log(gs.get()); 

То, как код в пути 2 используется это:

var gs = require('./get-set-b.js')(); 

console.log(gs.get()); 
gs.set(100); 
console.log(gs.get()); 

При работе как с помощью команды line, under node.js Я получаю одинаковые результаты.

Есть ли разница между путем 1 и образом 2 я должен быть в курсе? Возможно, они подходят для разных случаев использования? Если нет, что более идиоматично?

+0

@Andy был там и в подобном места; не тот же угол - вот почему в моем вопросе я лишь * упоминаю * тот факт, что в последнем случае мне пришлось присваивать 'module.exports' в отличие от' export', но я больше не занимаюсь или не нуждаюсь в каких-либо разъяснениях на том. –

+0

@ близкие избиратели: это не дубликат. Хотя между «module.exports» и «export» существует путаница, фактический вопрос здесь о экземплярах модулей не упоминается ** в «дубликате», не говоря уже о * охватываемых * – Matt

ответ

1

Второе позволяет запускать несколько «экземпляров» вашего модуля, первое - нет.


Использование первого подхода.

a.js

var gs = require('./get-set-a.js'); 

gs.set(100); 
console.log(gs.get()); // 100; 

require('./b'); 

b.js

var gs = require('./get-set-a.js'); 

console.log(gs.get()); // 100; 

Использование второго подхода

a.js

var gs = require('./get-set-a.js')(); 

gs.set(100); 
console.log(gs.get()); // 100; 

require('./b'); 

b.JS

var gs = require('./get-set-a.js')(); 

console.log(gs.get()); // 0; 

Просто чтобы быть совершенно ясно, то Мультиэкземпляр вещь не потому, что вы присваивание module.exports, а не exports; это потому, что ваш инициализатор возвращает новое закрытие каждый раз, когда он вызывается. Вы могли бы достичь нескольких экземпляров с экспорта как таковой;

exports.create = function() { 
    var x = 0; 

    function get() {return x;} 

    function set(_x) {x = _x;} 

    return {get:get, set:set}; 
}; 

c.js

var gs = require('./get-set-b.js').create(); 

console.log(gs.get()); // 0 
gs.set(100); 
console.log(gs.get());/100 

d.js

b.js Get-зор-

var gs = require('./get-set-b.js').create(); 

console.log(gs.get()); // 0 
gs.set(100); 
console.log(gs.get()); // 100 
Смежные вопросы