Значения не 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 вокруг "где-то" согласно спецификации. Сейчас на практике движки сохраняют значения в памяти, поэтому все, что я сказал, более или менее верно для всех основных движков