Что происходит в Javascript в этом конкретном случае (звонок через общий доступ)? - PullRequest
1 голос
/ 28 апреля 2020

Javascript использует Call by Sharing, но у меня есть вопрос, связанный с чем-то в React.

Что происходит, когда вы устанавливаете состояние (setState Hook или Class State) внутри функции? Например:

const [myState, setMyState] = useState(null);

const foo = () => {
   const bar = {'prop': 1};
   setMyState(bar);
}

foo();

Как javascript отслеживает значение состояния, которое было установлено внутри функции, потому что, насколько я понимаю, bar умирает после выполнения foo.

Копирует ли setState переданное значение или я что-то упустил?

1 Ответ

0 голосов
/ 28 апреля 2020

Значения не d ie. Значения l ie сохраняются в памяти навсегда, пока никто не приходит и не стирает их (сборщик мусора). Однако, пока у вас есть ссылка на это значение в памяти, сборщик мусора не будет касаться его. Теперь bar содержит ссылку на объект в вашем случае. Когда вы вызываете setMyState, вы передаете ссылку, чтобы setMyState мог получить доступ к объекту в памяти, пока ссылка существует. В конечном счете, реагирует, сохраняет эту ссылку где-нибудь, чтобы вернуть ее к myState при повторном отображении.

  // A very simplified version of useState:
 let state; // the secret place were we keep the reference

 function useState(initial) {
  if(!state) state = initial;
  function setState(value) { // here we get the reference
    // food for thought: what happens to the object state referenced before here?
    state = value; // and here we store it
    render();
  }
  return [state, setState]; // here we pass on the reference to the render function
 }

 function render() {
  const [counter, setCounter] = useState({ value: 1 }); // here we get a reference to the object
  console.log(counter);
  setTimeout(() => setCounter({ value: counter.value + 1 }), 1000); // and here we pass a new one in
 }

 render();

Если вы не передадите ссылку, то, когда выполнение foo закончится, никто не сможет получить доступ bar больше, и, следовательно, никто не может получить доступ к объекту, лежащему в памяти, и, следовательно, сборщик мусора в конечном итоге придет.


Все вышеперечисленное - это ie. В JavaScript нет такой вещи как ссылка (хорошо, есть Ссылка, но она делает что-то другое), также нет такой вещи, как память. Значения просто l ie вокруг "где-то" согласно спецификации. Сейчас на практике движки сохраняют значения в памяти, поэтому все, что я сказал, более или менее верно для всех основных движков

...