Я просматриваю документацию Redux и начинаю с примера Todo здесь:

https://github.com/reactjs/redux/tree/master/examples/todos

Работает нормально. Хотя есть кое-что базовое, чего я не понимаю. Ниже приведен фрагмент кода из файла index.js, который определяет действия:

let nextTodoId = 0
export const addTodo = (text) => ({
  type: 'ADD_TODO',
  id: nextTodoId++,
  text
})

Весь файл можно увидеть по следующему URL:

https://github.com/reactjs/redux/blob/master/examples/todos/src/actions/index.js

Как вы можете видеть, переменная nextTodoId инициализируется вне функции addtodo. Мне интересно, как получается, что переменная 'nextTodoId' не сбрасывается в 0 каждый раз, когда вызывается функция?

Может кто-нибудь объяснить, пожалуйста?

Спасибо за ваше время.

0
Bharat 25 Фев 2018 в 03:36

3 ответа

Лучший ответ

Переменная nextTodoId объявлена в той же области видимости (область модуля), что и функция addTodo. Содержимое внутри файла модуля обрабатывается так, как если бы оно было заключено в замыкание области, как это происходит с замыканиями функций. Модули оцениваются только один раз, даже если они импортированы несколько раз. Поэтому переменная nextTodoId объявляется только один раз, и каждый раз, когда вызывается функция addTodo, будет использоваться текущее значение переменной nextTodoId.

1
Carloluis 25 Фев 2018 в 01:05

Это функция того, как import и require работают в модулях Javascript. Загрузчик модуля запускает код в каждом импортируемом / требуемом файле один раз. После этого он кэширует результат, и любые другие модули, которые импортируют или требуют этот файл в будущем, получают кэшированную версию.

Поэтому nextTodoId инициализируется только в первый раз, когда файл import ed / require d.

1
stone 25 Фев 2018 в 00:45

NextTodoId принадлежит области действия вне addTodo. Следовательно, эта переменная может быть доступна из addTodo, но ей не принадлежит, поэтому даже когда вы вернетесь из функции, переменная будет существовать.

1
Keith Rousseau 25 Фев 2018 в 00:43