Следует ли мне избегать использования переменных верхнего уровня в модуле? - PullRequest
0 голосов
/ 09 ноября 2018

Я пишу код с помощью React и пытаюсь переместить некоторые логики в модули, но я в замешательстве.

Я писал такие модули, как следующие строки.

// fooModule.js
let count = 0

export function countUp() {
    count += 1
}

export function getCount() {
    return count
}

Эта count переменная не может быть доступна из внешнего модуля, как ожидалось.

Тем не менее, я заметил, что состояние этой переменной сохраняется, Когда я дважды импортирую этот модуль, переменная статус поделился в обоих.

Итак, я должен перейти к следующему?

// fooModule.js
export function countUp(count) {
    return count + 1
}

// someClass.js
import { countUp } from './fooModule.js'

const count = 0
const newCount = countUp(count)

Спасибо.

Добавить: Спасибо за множество ответов за короткое время! Я исправил неправильный пример кода.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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

Это означает, что если вам нужны отдельные экземпляры, вы должны создать нечто, создающее эти экземпляры, а затемэкспортируйте эту вещь.Вот некоторые вещи, которые делают экземпляры вещей:

  • Классы,
  • Конструкторы,
  • Заводские функции и т. Д.
// fooModule.js
export class Counter {
  constructor(count = 0) {
    this.count = count
  }
  countUp() {
    return ++this.count
  }
}

// index.js
const counterA = new Counter(1)
console.log(counterA.countUp()) // 2

const counterB = new Counter(0)
console.log(counterB.countUp()) // 1
0 голосов
/ 09 ноября 2018

Ваш второй код не будет работать, потому что count не входит в область действия fooModule, потому что вы создали его в someClass. Если вы хотите, чтобы у каждого импортера fooModule была отдельная привязка для count, можно было бы экспортировать функцию , которая при вызове создает переменную count и возвращает функцию, которая увеличивает его и возвращает новый счет:

// fooModule.js
export function makeCount() {
  let count = 0;
  return () => {
    count++;
    return count;
  };
}

// someClass.js
import { makeCount } from './fooModule.js';
const counter = makeCount();
console.log(counter()); // 1
console.log(counter()); // 2

Или с генераторами:

// fooModule.js
function* makeCount() {
  let count = 0;
  while (true) {
    count++;
    yield count;
  }
}

// someClass.js
const counter = makeCount();
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2

(вы также можете использовать return ++count вместо count++; return count; в обоих приведенных выше кодах, но читать IMO немного сложнее)

...