Итак, мой вопрос: где эти числа хранятся в этих отреагированных компонентах реакции?
Это не имеет ничего общего с React. Так работают функции в JavaScript.
Всякий раз, когда функция вызывается, создается новая среда. Среда - это внутренняя структура данных, сохраняющая состояние (не путать с состоянием компонента React!). Значения параметров и переменных хранятся в этой среде.
Например, рассмотрим функцию:
function foo(bar) {
var baz = 42;
}
foo(21);
Когда вызывается foo
, создается новая среда с двумя записями:
<foo environment>
bar: 21
baz: 42
Примечание: Вызовы функций изолированы. Каждый раз, когда вызывается функция, для этого вызова создается новая среда.
В вашем коде
Каждый раз, когда вызывается renderSquare
, создается новая среда с записью i
.
Замыкания - это функции, которые могут разрешать переменные, которые не определены сами по себе. Рассмотрим следующий пример:
function add(x) {
return function innerAdd(y) {
return x + y;
}
}
var add5 = add(5);
add5(2); // 7
Здесь innerAdd
ссылается на x
, но x
не определяется внутри себя, это '
Вместо этого определяется "далее вверх" в add
.
При выполнении add
создается новая среда с
<add environment>
x: 5
innerAdd
имеет ссылку на эту среду! Поэтому, когда add5
/ innerAdd
выполняется, он может искать x
в этой среде. Вы можете думать о средах, связанных друг с другом:
<innerAdd environment>
y: 2
parentEnvironment:
<add environment>
x: 5
Сначала мы увидим, определено ли x
в <innerAdd environment>
. Поскольку это не так, мы смотрим на его родителя и т. Д.
В вашем коде
Точно так же происходит с обработчиком событий, который вы создаете внутри renderSquare
. Обработчик событий - это функция, которая создается внутри среды, в которой i=0
(и / или i=1
, i=2
и т. Д.).
Вот упрощенный пример, в котором не используется React:
function createButton(i) {
const button = document.createElement('button');
button.textContent = 'Click me';
button.onclick = () => console.log(i);
document.body.appendChild(button);
}
createButton(0);
createButton(1);
createButton(2);
Chrome позволяет проверять окружение (я), связанные с функцией. Например:
![enter image description here](https://i.stack.imgur.com/DL1PC.png)
Это показывает, что обработчик событий был создан внутри createButton
, где i
имеет значение 0
.
См. Также Как работают закрытия JavaScript?