Узловые модули - экспорт переменной по сравнению с экспортом функций, которые ссылаются на нее? - PullRequest
7 голосов
/ 12 сентября 2011

Легче всего объяснить с помощью кода:

##### module.js
var count, incCount, setCount, showCount;
count = 0; 

showCount = function() {
 return console.log(count);
};
incCount = function() {
  return count++;
};
setCount = function(c) {
  return count = c;
 };

exports.showCount = showCount;
exports.incCount = incCount;
exports.setCount = setCount; 
exports.count = count; // let's also export the count variable itself

#### test.js
var m;
m = require("./module.js");
m.setCount(10);
m.showCount(); // outputs 10
m.incCount();  
m.showCount(); // outputs 11
console.log(m.count); // outputs 0

Экспортируемые функции работают должным образом. Но мне не понятно, почему m.count тоже не 11.

Ответы [ 3 ]

14 голосов
/ 12 сентября 2011

exports.count = count

Ваше свойство count для объекта exports равно значению count. То есть 0.

Все передается по значению, а не по ссылке.

Если бы вы определили count как получатель, такой:

Object.defineProperty(exports, "count", {
  get: function() { return count; }
});

Тогда exports.count всегда будет возвращать текущее значение count и, таким образом, будет 11

0 голосов
/ 12 сентября 2011

В JavaScript функции и объекты (включая массивы) присваиваются переменным по ссылке, а строки и числа присваиваются по значению, то есть путем создания копии.Если var a = 1 и var b = a и b++, a будут по-прежнему равны 1.

В этой строке:

exports.count = count; // let's also export the count variable itself

вы сделали побочную копию счетапеременная.Все операции setCount (), incCount () и showCount () работают с переменной count внутри замыкания, поэтому m.count больше не затрагивается.Если бы эти переменные работали с этим.счетом, то вы бы получили ожидаемое поведение, но, вероятно, вы все равно не хотите экспортировать переменную count.

0 голосов
/ 12 сентября 2011

Поправьте меня, если я ошибаюсь, но числа являются неизменными типами.Когда вы изменяете значение count, ваша ссылка тоже меняется.Так что exports.count ссылки на старое count значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...